在此两段代码,先粘别人的吧,写的比我好
#include<cstdio>
#include<cstring>
using namespace std;
char a[105],b[105];
int pre[105][105];
void out(int i,int j)
{
if(!i&&!j)return;
if(pre[i][j]==j+1)
{
out(i-1,j-1);
putchar(a[i]);
}
else if(pre[i][j]==j)
{
out(i-1,j);
putchar(a[i]);
}
else
{
out(i,j-1);
putchar(b[j]);
}
}
void LCS()
{
int n=strlen(a+1),m=strlen(b+1),i,j,dp[105][105]= {0};
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
if(a[i]==b[j])
{
dp[i][j]=dp[i-1][j-1]+1;
pre[i][j]=j+1;
}
else if(dp[i][j-1]>dp[i-1][j])
{
dp[i][j]=dp[i][j-1];
pre[i][j]=j-1;
}
else
{
dp[i][j]=dp[i-1][j];
pre[i][j]=j;
}
out(n,m);
puts("");
}
int main()
{
while(scanf("%s %s",a+1,b+1)==2)
LCS();
}
自己的:
#include<iostream>
#include<cstring>
#include<cmath>
#include<string>
#include<cstdio>
using namespace std;
const int MAXN=105;
char s1[MAXN],s2[MAXN];
int f[MAXN][MAXN];
int key[MAXN][MAXN];
char ans[MAXN];
int en,snd,t1,t2;
struct node
{
char c;int pre;
}path[MAXN*5];
int MAX(const int a,const int b){return a>b?a:b;}
void dp()
{
int i,j;
en=0;
memset(f,0,sizeof f);
memset(key,-1,sizeof key);
for(i=1;i<=t1;i++)
for(j=1;j<=t2;j++)
{
if(s1[i-1]==s2[j-1])
{
f[i][j]=f[i-1][j-1]+1;
path[en].c=s1[i-1];
path[en].pre=key[i-1][j-1];
key[i][j]=en++;
}
else
{
if(f[i-1][j]>f[i][j-1])
{
f[i][j]=f[i-1][j];
key[i][j]=key[i-1][j];
}
else
{
f[i][j]=f[i][j-1];
key[i][j]=key[i][j-1];
}
}
}
}
void showpath(int id)
{
if(id==-1)return ;
showpath(path[id].pre);
ans[snd++]=path[id].c;
}
int main()
{
int i,j,k;
//freopen("123.txt","r",stdin);
while(~scanf("%s%s",&s1,&s2))
{
t1=strlen(s1);
t2=strlen(s2);
dp();
snd=0;
showpath(key[t1][t2]);
ans[snd]='\0';
int cur1=0,cur2=0,cur3=0;
while(1)
{
if(s1[cur1]==ans[cur3]&&s2[cur2]!=ans[cur3])
{
printf("%c",s2[cur2++]);
}
else if(s2[cur2]==ans[cur3]&&s1[cur1]!=ans[cur3])
{
printf("%c",s1[cur1++]);
}
else if(s1[cur1]==s2[cur2]&&s2[cur2]==ans[cur3])
{
printf("%c",s2[cur2++]);
cur1++;cur3++;
}
else
{
printf("%c%c",s1[cur1++],s2[cur2++]);
}
if(cur3==snd)
{
printf("%s%s",s1+cur1,s2+cur2);
break;
}
}
printf("\n");
}
return 0;
}
哎,对问题没分析透彻,写麻烦了