这提是lcs的加强版,需要记录一下它的变化过程,然后递归输出。
最长公共子序列 dp[i][j]=max(dp[i-1][j],dp[i][j-1])(s1[i]!=s2[j])
dp[i][j]=dp[i-1][j-1]+1(s1[i]==s2[j])
这道题只要输出公共子序列一次
#include<cstdio>
#include<cstring>
char s1[105],s2[105],n,m;
int dp[105][105];
int t[105][105];
void LCS(){
n=strlen(s1);
m=strlen(s2);
for(int i=0;i<=n;i++){
t[i][0]=3;
}
for(int i=0;i<=m;i++){
t[0][i]=1;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(s1[i-1]==s2[j-1]){
dp[i][j]=dp[i-1][j-1]+1;
t[i][j]=2;
}
else if(dp[i-1][j]<dp[i][j-1]){
dp[i][j]=dp[i][j-1];
t[i][j]=1;
}
else{
dp[i][j]=dp[i-1][j];
t[i][j]=3;
}
}
}
}
void print(int i,int j)
{
if((i==0)&&(j==0))
return;
if(t[i][j]==2){
print(i-1,j-1);
printf("%c",s1[i-1]);
}
else if(t[i][j]==1){
print(i,j-1);
printf("%c",s2[j-1]);
}
else if(t[i][j]==3){
print(i-1,j);
printf("%c",s1[i-1]);
}
}
int main(){
while(scanf("%s%s",s1,s2)!=EOF){
memset(dp,0,sizeof(dp));
LCS();
print(n,m);
printf("\n");
}
return 0;
}