問題:輸入兩個字符串,返回最長公共子序列。
最長公共子序列問題(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