问题:
给定两个字符串,求解这两个字符串的最长公共子序列
注意,这里的序列与字串的含义不同,序列中的各个元素可以不连续,只要保证在两个字符串中出现的顺序相同就可以
解法:
递归式:
由于其中需要重复求解很多子问题,很容易想到用动态规划来优化递归,将子问题的解保存起来
template<typename T>
int LCS(vector<T> str1, vector<T> str2) {
vector<vector<int>> solut;
for (int i = 0; i <= str1.size(); i++) {
solut.push_back(vector<int>(str2.size()+1, 0));
}
for (int i = 1; i <= str1.size(); i++) {
for (int j = 1; j <= str2.size(); j++) {
if (str1[i-1] == str2[j-1]) {
solut[i][j] = solut[i - 1][j - 1] + 1;
}
else {
solut[i][j] = max(solut[i - 1][j], solut[i][j - 1]);
}
}
}
return solut[str1.size()][str2.size()];
}