输入
第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000)
输出
输出最长的子序列,如果有多个,随意输出1个。
输入示例
abcicba abdkscab
输出示例
abca
dp的时候记录路径,从终点反向寻找路径即可
代码如下:
#include<stdio.h>
#include<string.h>
#include<cstdlib>
#include <iostream>
using namespace std;
int dp[1005][1005];
struct node
{
int aa;
int bb;
}path[1005][1005];
int main()
{
char a[1005],b[1005];
while(~scanf("%s%s",a+1,b+1)) {
int lena=strlen(a+1);
int lenb=strlen(b+1);
memset(dp,0,sizeof(dp));
int x=lena,y=lenb;
for(int i=1;i<=lena;i++) {
for(int j=1;j<=lenb;j++) {
if(a[i]==b[j]) {
dp[i][j]=dp[i-1][j-1]+1;
path[i][j].aa=-1;
path[i][j].bb=-1;
}
else {
if(dp[i-1][j]>dp[i][j-1]) {
dp[i][j]=dp[i-1][j];
path[i][j].aa=-1;
path[i][j].bb=0;
}
else {
dp[i][j]=dp[i][j-1];
path[i][j].aa=0;
path[i][j].bb=-1;
}
}
}
}
char ans[1005];
int k=0;
while(x!=0&&y!=0) {
if(a[x]==b[y]) {
ans[k++]=a[x];
}
int xx=path[x][y].aa;
int yy=path[x][y].bb;
x+=xx;
y+=yy;
}
for(int i=k-1;i>=0;i--) {
printf("%c",ans[i]);
}
printf("\n");
}
return 0;
}