这个解释挺容易理解的:
给出两个字符串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
*/