[编程题] 最长公共子序列
对于两个字符串,请设计一个高效算法,求他们的最长公共子序列的长度,这里的最长公共子序列定义为有两个序列U1,U2,U3...Un和V1,V2,V3...Vn,其中Ui<Ui+1,Vi<Vi+1。且A[Ui] == B[Vi]。
给定两个字符串A和B,同时给定两个串的长度n和m,请返回最长公共子序列的长度。保证两串长度均小于等于300。
测试样例:
"1A2C3D4B56",10,"B1D23CA45B6A",12
返回:6
请看我的另一篇博文:点击打开链接
class LCS {
public:
int findLCS(string str1, int n, string str2, int m) {
// write code here
int len1 = str1.size() ;
int len2 = str2.size() ;
vector<vector<int>> vec( 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 ) {
vec[i][j] = 0 ;
} else if ( str1[i - 1] == str2[j - 1] ) {
vec[i][j] = vec[i - 1][j - 1] + 1 ;
} else if ( vec[i - 1][j] >= vec[i][j - 1] ) {
vec[i][j] = vec[i - 1][j] ;
} else {
vec[i][j] = vec[i][j - 1] ;
}
}
}
return vec[len1][len2] ;
}
};
第二次做:
class LCS {
public:
int findLCS(string str1, int n, string str2, int m) {
// write code here
vector<vector<int>> vec( str1.size() + 1, vector<int>( str2.size() + 1, 0 ) ) ;
for ( int i = 0; i <= str1.size(); ++ i ) {
for ( int j = 0; j <= str2.size(); ++ j ) {
if ( i == 0 || j == 0 ) vec[i][j] = 0 ;
else if ( str1[i - 1] == str2[j - 1] ) vec[i][j] = vec[i - 1][j - 1] + 1 ;
else if ( vec[i - 1][j] > vec[i][j - 1] ) vec[i][j] = vec[i - 1][j] ;
else vec[i][j] = vec[i][j - 1] ;
}
}
return vec[str1.size()][str2.size()] ;
}
};