这个解释挺容易理解的:
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
比如两个串为:
abcicba
abdkscab
ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
Input
第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000)
Output
输出最长的子序列,如果有多个,随意输出1个。
Input示例
abcicba abdkscab
Output示例
abca
代码如下:
需要注意的是,它是随机输出的一组最长公共子序列,以测试样例为例,如果
void LcsLength(int m,int n)函数里的
else if(num[i - 1][j] > num[i][j - 1])改为
else if(num[i - 1][j] >= num[i][j - 1])
那输出的就是abcb了,卡在这里好久。。。。。
心塞。
#include<iostream> #include<cstring> using namespace std; char a[1002],b[1002]; int num[1002][1002]; int flag[1002][1002]; void LcsLength(int m,int n) { int i,j; for(i = 1;i <= m;i++) for(j = 1;j <= n;j++) { if(a[i] == b[j]) { num[i][j] = num[i - 1][j - 1] + 1; flag[i][j] = 1; } else if(num[i - 1][j] > num[i][j - 1]) { num[i][j] = num[i - 1][j]; flag[i][j] = 2; } else { num[i][j] = num[i][j -1]; flag[i][j] = 3; } } } void Lcs(int i,int j) { if(i == 0 || j == 0) return ; if(flag[i][j] == 1) { Lcs(i - 1,j - 1); cout << a[i]; } else if(flag[i][j] == 2) Lcs(i - 1,j); else Lcs(i,j - 1); } int main() { cin >> a + 1 >> b + 1; int m = strlen(a + 1); int n = strlen(b + 1); LcsLength(m,n); Lcs(m,n); return 0; } /* Sample Input abcicba abdkscab Sample Output abca */