点击打开链接
//最长公共子序列
#include<iostream>
#include<cstdio>
#include<cstring>
#include<stack>
using namespace std;
const int maxn=1000+5;
int dp[maxn][maxn]; //dp[i][j]表示的是两个字符串当前的最长公共子序列
int main()
{
char a[maxn],b[maxn];
scanf("%s",a+1);
scanf("%s",b+1);
memset(dp,0,sizeof(dp));
int len1=strlen(a+1),len2=strlen(b+1);
for(int i=1;i<=len1;i++)
for(int j=1;j<=len2;j++)
{
dp[i][j]=max(dp[i-1][j],max(dp[i][j-1],dp[i-1][j-1]+(a[i]==b[j]?1:0)));
}
//路径回溯
int i=len1,j=len2;
stack<int>f;
while(i>0&&j>0)
{
if(a[i]==b[j])
{
f.push(a[i]);
i--;
j--;
}
else if(dp[i-1][j]>dp[i][j-1]) {
i--;
}
else j--;
}
while(!f.empty())
{
printf("%c",f.top());
f.pop();
}
printf("\n");
return 0;
}