版权声明:本文为博主原创文章,转载需注明出处。 https://blog.csdn.net/zz_Caleb/article/details/80637956
这个题如果只是让输出最长公共子序列的长度,就比较简单,但是让输出最长公共子序列,增加了难度。
给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
比如两个串为:
abcicba
abdkscab
ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
Input 第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000) Output 输出最长的子序列,如果有多个,随意输出1个。 Sample Input
abcicba abdkscabSample Output
abca
AC代码:
#include<cstring>
#include<string>
#include<cstdio>
#include<cmath>
#include<algorithm>
char a[1003],b[1003];
using namespace std;
int main()
{
scanf("%s",a+1);
scanf("%s",b+1);
int m=strlen(a+1),n=strlen(b+1);
int s[m+1][n+1];
for(int i=0;i<=m;i++){
for(int j=0;j<=n;j++)
if(j==0||i==0) s[i][j]=0;
else if(a[i]==b[j]) s[i][j]=s[i-1][j-1]+1;
else s[i][j]=max(s[i-1][j],s[i][j-1]);
}
int i=m,j=n;
string c;
while(i&&j){
if(a[i]==b[j]){
c+=a[i];
i--;
j--;
}
else if(s[i][j]==s[i-1][j]) i--;
else j--;
}
for(i=c.size()-1;i>=0;i--)
printf("%c",c[i]);//cout<<c[i];
return 0;
}