此题先找出公共部分的位置,然后按顺序输出,公共部分只输出一次,先输出a的,遇到公共的然后输出b公共之前的然后输出公共部分,最后把b多出来的部分输出。
主要是记录路径。
代码:
#include<stdio.h>
#include<string.h>
int dp[110][110],patha[110],pathb[110];
int Max(int a,int b)
{
return a>b?a:b;
}
int main()
{
char a[110],b[110];
int i,j,k,len1,len2,len,t,ii,jj;
while(scanf("%s%s",&a,&b)!=EOF)
{
len1=strlen(a);
len2=strlen(b);
len=Max(len1,len2);
memset(dp,0,sizeof(dp));
for(i=1;i<=len1;i++)
{
for(j=1;j<=len2;j++)
{
if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=Max(dp[i-1][j],dp[i][j-1]);
}
}
memset(patha,0,sizeof(patha));
memset(pathb,0,sizeof(pathb));
i=len1,j=len2,k=0;
while(dp[i][j])
{
if(dp[i][j]==dp[i-1][j]) i--;
else if(dp[i][j]==dp[i][j-1]) j--;
else
{
patha[k]=i-1;
pathb[k]=j-1;
k++;
i--;
j--;
}
}
/*for(i=k-1;i>=0;i--)
printf("%c ",b[pathb[i]]);
printf("\n");
for(i=k-1;i>=0;i--)
printf("%c ",a[patha[i]]);
printf("\n");*/
t=k-1,jj=0;;
for(i=0;i<len1;i++)
{
if(i!=patha[t])
printf("%c",a[i]);
else
{
for(j=jj;j<=pathb[t];j++)
printf("%c",b[j]);
jj=j;
t--;
}
}
for(j=jj;j<len2;j++) printf("%c",b[j]);
printf("\n");
}
return 0;
}