给出两个字符串,找到最长公共子序列(LCS),返回LCS的长度。
样例
给出"ABCD" 和 "EDCA",这个LCS是 "A" (或 D或C),返回1
给出 "ABCD" 和 "EACB",这个LCS是"AC"返回 2
class Solution {
public:
/**
* @param A, B: Two strings.
* @return: The length of longest common subsequence of A and B.
*/
int longestCommonSubsequence(string A, string B) {
// write your code here
if(A.empty()||B.empty()) return 0;
int n1=A.size();
int n2=B.size();
vector<vector<int>>a(n1,vector<int>(n2));
a[0][0]=(A[0]==B[0]?1:0);
for(int j=1;j<n2;j++){
if(a[0][j-1]==0) a[0][j]=same(A,B,0,j);
else a[0][j]=1;
}
for(int i=1;i<n1;i++){
if(a[i-1][0]==0) a[i][0]=same(A,B,i,0);
else a[i][0]=1;
}
for(int i=1;i<n1;i++){
for(int j=1;j<n2;j++){
a[i][j]=max(a[i-1][j-1]+same(A,B,i,j),max(a[i-1][j],a[i][j-1]));
}
}
return a[n1-1][n2-1];
}
int same(string A,string B,int i1,int i2){
if(A[i1]==B[i2]) return 1;
else return 0;
}
};