给出两个字符串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
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAX=1001;
char str1[MAX];
char str2[MAX];
char str[MAX];
int a[MAX][MAX]={0};
int main()
{
int i,j;
while(scanf("%s %s",str1,str2)!=EOF)
{
int len1=strlen(str1);
int len2=strlen(str2);
for(i=1;i<=len1;i++)
{
for(j=1;j<=len2;j++)
if(str1[i-1]==str2[j-1])
a[i][j]=a[i-1][j-1]+1;
else
a[i][j]=max(a[i-1][j],a[i][j-1]);
}
int num=0;
for(int k=len1,m=len2;k>=1&&m>=1;)
{
if(str1[k-1]==str2[m-1])
{
str[num++]=str1[k-1];
k--;
m--;
}
else if(a[k][m-1]>a[k-1][m])
m--;
else
k--;
}
for(int k=num-1;k>=0;k--)
cout<<str[k];
cout<<endl;
}
return 0;
}