对两个字符串求最大公共子序列,子序列意味着不是连续的序列。
子问题:LCS(s1,s2)表示最大公共子序列
首先基于一个判断,
1)s1和s2有相同的结尾x,那么x一定在最大公共子序列中, LCS(s1,s2)=LCS(s1[:-1],s2[:-1])+1
2)s1和s2没有相同结尾,那么LCS(s1,s2)=max{ LCS(s1[:-1],s2),LCS(s1,s2[:-1]) }
可以写成下面的表达式,C[i,j]表示s1的前i个字符和s2的前j个字符的最大公共子序列,其中i=0或者j=0时,表示其中一个字符串为空,这时候LCS=0
伪代码:
int lcs(string str1, string str2, vector<vector<int>>& vec) {
int len1 = str1.size();
int len2 = str2.size();
vector<vector<int>> c(len1 + 1, vector<int>(len2 + 1, 0)); #初始化(len1+1)个vector<int>(len2 + 1, 0)
for (int i = 0; i <= len1; i++) {
for (int j = 0; j <= len2; j++) {
if (i == 0 || j == 0) {
c[i][j] = 0;
}
else if (str1[i - 1] == str2[j - 1]) {
c[i][j] = c[i - 1][j - 1] + 1;
}
else if (c[i - 1][j] >= c[i][j - 1]){
c[i][j] = c[i - 1][j];
}
else{
c[i][j] = c[i][j - 1];
}
} #for (int j = 0; j <= len2; j++) {
} #for (int i = 0; i <= len1; i++) {
return c[len1][len2];
}