输入
第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000)
输出
输出最长的子序列,如果有多个,随意输出1个。
输入示例
abcicba abdkscab
输出示例
abca
请选取你熟悉的语言,并在下面的代码框中完成你的程序,注意数据范围,最终结果会造成Int32溢出,这样会输出错误的答案。
不同语言如何处理输入输出,请查看下面的语言说明。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[1100][1100],f[1100][1100];
char s[1100];
char a[1100],b[1100];
int main()
{
while(~scanf("%s%s",&a,&b))
{
int lena=strlen(a);
int lenb=strlen(b);
for(int i=1;i<=lena;i++)
{
for(int j=1;j<=lenb;j++)
{
if(a[i-1]==b[j-1])
{
dp[i][j]=dp[i-1][j-1]+1;
f[i][j]=1;//标记相同字母
}
else if(dp[i][j-1]>dp[i-1][j])
{
dp[i][j]=dp[i][j-1];
f[i][j]=2;
}
else
{
dp[i][j]=dp[i-1][j];
f[i][j]=3;
}
}
}
//printf("%d\n",dp[lena][lenb]);
int k=0;
int ii=lena,jj=lenb;
char s[1100];
while(ii>0&&jj>0)
{
if(f[ii][jj]==1)//逆序存储
{
s[k]=a[ii-1];
k++;
ii--;
jj--;
}
else if(f[ii][jj]==2)
jj--;
else
ii--;
}
for(int i=k-1;i>=0;i--)
printf("%c",s[i]);
}
return 0;
}
恭喜!你的程序通过了所有的数据测试。