#include<cstdio>
#include<cstring>
#include<iostream>
#include<stack>
using namespace std;
char a[1000+5],b[1000+5];
int sum[1000+5][1000+5];
void work(){
memset(sum,0,sizeof(sum));
int la=strlen(a+1),lb=strlen(b+1);
for(int i=1;i<=la;i++){
for(int j=1;j<=lb;j++){
if(a[i]==b[j])sum[i][j]=sum[i-1][j-1]+1;
else sum[i][j]=max(sum[i-1][j],sum[i][j-1]);
}
}
//输出
stack<char>ans;
int i=la,j=lb;
while(i>=1&&j>=1){
if(a[i]==b[j])ans.push(a[i]),i--,j--;
while(sum[i][j]==sum[i-1][j])i--;
while(sum[i][j]==sum[i][j-1])j--;
}
while(!ans.empty()){
printf("%c",ans.top());
ans.pop();
}
cout<<"\n";
}
int main(){
scanf("%s%s",a+1,b+1);
work();
}
最长公共子序列(LCS)
最新推荐文章于 2019-06-01 17:42:00 发布