题目:给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
输入
第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000)
输出
输出最长的子序列,如果有多个,随意输出1个。
输入示例
abcicba abdkscab
输出示例
abca
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
char A[1010],B[1010];
int LCS[1010][1010];
int b[1010][1010];
void PrintLCS(int d[][1010], char *x, int i, int j)
{
if(i==0 || j==0)
return;
if(d[i][j]==0)
{
PrintLCS(d,x,i-1,j-1);
printf("%c",x[i-1]);
}
else if(d[i][j]==1)
PrintLCS(d,x,i-1,j);
else
PrintLCS(d,x,i,j-1);
}
//void P(char *x){
// int l=strlen(x);
// for(int i=0;i<l;i++){
// printf("%c ",x[i]);
// }
//}
int main(){
int x,y;
while(scanf("%s%s",A+1,B+1)!=EOF){
int l1=strlen(A+1);
int l2=strlen(B+1);
for(x=0;x<=l1;x++){
for(y=0;y<=l2;y++){
if(x==0||y==0){
LCS[x][y]=0;
b[x][y]=0;
}
else if(A[x]==B[y]){
LCS[x][y]=LCS[x-1][y-1]+1;
b[x][y]=0;
}
else if(LCS[x-1][y]>=LCS[x][y-1]){
LCS[x][y]=LCS[x-1][y];
b[x][y]=1;
}
else{
LCS[x][y]=LCS[x][y-1];
b[x][y]=-1;
}
}
}
PrintLCS(b, A+1, l1, l2);
printf("\n");
// P(A+1);
}
return 0;
}