给出两个字符串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<algorithm>
#include<string.h>
#include<string>
const int N=1010;
using namespace std;
char a[N],b[N],ans[N];
int dp[N][N];
int main()
{
int i,j;
cin>>a>>b;
int la=strlen(a);
int lb=strlen(b);
for(i=1;i<=la;i++)
{
for(j=1;j<=lb;j++)
{
if(a[i-1]==b[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
cout<<dp[i][j]<<" ";
}
cout<<endl;
}
int len=dp[la][lb];
cout<<len<<endl;
i=la;
j=lb;
int k=0;
while(dp[i][j])
{
if(dp[i][j]==dp[i-1][j])
--i;
else if(dp[i][j]==dp[i][j-1])
--j;
else
{
ans[k++]=a[i-1];
cout<<a[i-1]<<endl;
--i;
--j;
}
}
for(int i=len-1;i>=0;i--)
cout<<ans[i];
return 0;
}
*/
#include<iostream>
#include<algorithm>
#include<string.h>
#include<string>
using namespace std; char a[1010],b[1010],ans[1010];
int dp[1010][1010];
int main()
{
cin>>a>>b;
int la=strlen(a),lb=strlen(b);
int i,j;
for(i=1;i<=la;i++)
{
for(j=1;j<=lb;j++)
{
if(a[i-1]==b[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
cout<<dp[i][j]<<" ";
}cout<<endl;
}
int len=dp[la][lb];
int k=0;
i=la,j=lb;
while(dp[i][j])
{
if(dp[i][j]==dp[i-1][j]) --i;
else if(dp[i][j]==dp[i][j-1]) --j;
else
{
ans[k++]=a[i-1];
--i;
--j;
}
}
for(i=len-1;i>=0;--i)
cout<<ans[i];
return 0;
}