问题:输入两个字符串,返回最长公共子序列。
最长公共子序列问题(Longest Common Subsequence)是经典的动态规划问题,可以通过以下方式来求解较小规模的问题:
在找A和B的公共子序列时:
如果有am-1==bn-1,则进一步解决一个子问题,找“a0,a1,…,am-2”和“b0,b1,…,bm-2”的一个最长公共子序列;
如果am-1!=bn-1,则要解决两个子问题:
找出“a0,a1,…,am-2”和“b0,b1,…,bn-1”的一个最长公共子序列;
找出“a0,a1,…,am-1”和“b0,b1,…,bn-2”的一个最长公共子序列;
再取两者中较长者作为A和B的最长公共子序列。
C++代码实现如下:
string LCS(string str1, string str2) {
int len1 = str1.size();
int len2 = str2.size();
vector<vector<int> > c(len1 + 1, vector<int>(len2 + 1, 0));
for (int i = 1; i <= len1; ++i)
for (int j = 1; j <= len2; ++j)
if (str1[i - 1] == str2[j - 1]) c[i][j] = c[i - 1][j - 1] + 1;
else c[i][j] = max(c[i - 1][j], c[i][j - 1]);
int len = c[len1][len2];
string res(len, 0);
int i = len1, j = len2;
while (i && j) {
if (str1[i - 1] == str2[j - 1]) {
res[--len] = str1[--i];
--j;
}
else c[i - 1][j] > c[i][j- 1] ? --i : --j;
}
return res;
}
参考链接:http://blog.csdn.net/hackbuteer1/article/details/6686925