给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
比如两个串为:
abcicba
abdkscab
ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
Input
第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000)
Output
输出最长的子序列,如果有多个,随意输出1个。
Sample Input
abcicba
abdkscab
Sample Output
abca
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int str[1005][1005];
char a[1004];
char b[1004];
int lena,lenb;
void cmp()
{
for(int i=1; i<=lena; i++)
{
for(int j=1; j<=lenb; j++)
{
if(a[i-1]==b[j-1])
{
str[i][j] = str[i-1][j-1]+1; ///未改变的dp加上1,
}
else
{
str[i][j] = max(str[i-1][j],str[i][j-1]);///取最大值
}
}
}
int i = lena-1;
int j = lenb-1;
char e[1001];
int t=0;
while(i>=0 && j>=0)
{
if(a[i]==b[j])
{
e[t++]=a[i];
i--;
j--;
}
else if(str[i][j+1]>str[i+1][j]) ///比较旁边的和上面的值,去最大值返回。
i--;
else j--;
}
for(int k=t-1; k>=0; k--)
{
printf("%c",e[k]);
}
printf("\n");
}
int main()
{
memset(str,0,sizeof(str));
gets(a);
gets(b);
lena = strlen(a);
lenb = strlen(b);
cmp();
return 0;
}
注:还看不懂,反省上一篇的,去记忆。