给出两个字符串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>
#include<cmath>
using namespace std;
#define maxn 1500
char a[maxn],b[maxn];
int obj[maxn][maxn];
char res[maxn];
int flag[maxn][maxn];
int main(){
int len1,len2;
gets(a);
gets(b);
len1=strlen(a);
len2=strlen(b);
memset(flag,0,sizeof(flag));
memset(obj,0,sizeof(obj));
for(int i=1;i<=len1;i++){
for(int j=1;j<=len2;j++){
if(a[i-1]==b[j-1]){
obj[i][j]=obj[i-1][j-1]+1;
flag[i][j]=1;
}else if(obj[i][j-1]>obj[i-1][j]){
obj[i][j]=obj[i][j-1];
flag[i][j]=2;
}else{
obj[i][j]=obj[i-1][j];
flag[i][j]=3;
}
}
}
int k=0;
int i=strlen(a);
int j=strlen(b);
while(i>0&&j>0){
if(flag[i][j]==1){
res[k++]=a[i-1];
i--;
j--;
}else if(flag[i][j]==2){
j--;
}else if(flag[i][j]==3){
i--;
}
}
//cout<<obj[len1][len2]<<endl;
for(int i=k-1;i>=0;i--){
printf("%c",res[i]);
}
cout<<endl;
return 0;
}