输入
第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000)
输出
输出最长的子序列,如果有多个,随意输出1个。
输入示例
abcicba abdkscab
输出示例
abca
代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char str1[1010];
char str2[1010];
int dp[1010][1010];
int flag[1010][1010];
char str3[1010];
int main()
{
scanf("%s%s",str1,str2);
memset(dp,0,sizeof(dp));
memset(flag,0,sizeof(flag));
int i,j;
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])
{
dp[i][j]=dp[i-1][j-1]+1;
flag[i][j]=1;
}
else
{
dp[i][j]=max(dp[i][j-1],dp[i-1][j]);//因为此题需要将最长公共子序列打印出来,所以需要给每一种情况标记
if(dp[i][j]==dp[i][j-1])
flag[i][j]=2;
else if(dp[i][j]==dp[i-1][j])
flag[i][j]=3;
}
}
int m=0;
while(len1>0&&len2>0)
{
if(flag[len1][len2]==1)
{
str3[m++]=str1[len1-1];//因为最长公共子序列不唯一,所以输出任意一种情况就可以了
len1--;
len2--;
}
else if(flag[len1][len2]==2) len2--;
else if(flag[len1][len2]==3) len1--;
}
for(i=m-1;i>=0;i--)
printf("%c",str3[i]);
printf("\n");
}