题目:最长公共子序列
解题思路:
动态规划算法。
设序列X ={x1x2 … xm}和Y ={y1y2 … yn}的最长公共子序列为Z ={z1z2 … zk} ,则有:
(1)若有xm = yn ,则zk = xm = yn ,且Zk-1 是 Xm-1和Yn-1的最长公共子序列。
(2)若有xm ≠ yn ,且zk ≠ xm ,且Zk-1 是 Xm-1和Yn的最长公共子序列。
(3)若有xm ≠ yn ,且zk ≠ yn ,且Zk-1 是 Xm和Yn-1的最长公共子序列。
其中Xm-1 ={x1x2 … xm-1}, Yn-1 ={y1y2 … yn-1}和Zk-1 ={z1z2 … zk-1}
用c[i,j]表示序列{X1…Xi}与序列{Y1…Yj}的最长公共子序列的长度,则有以下结论:
代码实现:
class Solution {
public:
vector<vector<int>> c;
int LCS(string &text1, string &text2, int i, int j){
if(c[i][j]!=-1){
return c[i][j];
}
if(i==0 || j==0){
c[i][j]=0;
return 0;
}
if(text1[i-1]==text2[j-1]){
c[i][j]=LCS(text1,text2,i-1,j-1)+1;
return c[i][j];
}
int l1=LCS(text1,text2,i,j-1);
int l2=LCS(text1,text2,i-1,j);
c[i][j]=l1>l2?l1:l2;
return c[i][j];
}
int longestCommonSubsequence(string text1, string text2) {
int len1=text1.length(),len2=text2.length();
c=vector<vector<int>>(len1+1,vector<int>(len2+1, -1));
return LCS(text1,text2,len1,len2);
}
};