找出公共子串只需要顺着dp数组往回找就可以了,还要注意可能两个母串前面很长一段距离都是都没有公共串,所以最后要把x和y退到0。
//
// main.cpp
// Richard
//
// Created by 邵金杰 on 16/9/17.
// Copyright © 2016年 邵金杰. All rights reserved.
//
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=200+10;
char s1[maxn],s2[maxn],s[maxn];
int dp[maxn][maxn];
int main()
{
while(scanf("%s%s",s1+1,s2+1)!=EOF)
{
memset(dp,0,sizeof(dp));
int len1=(int)strlen(s1+1);
int len2=(int)strlen(s2+1);
for(int i=1;i<=len1;i++)
{
for(int j=1;j<=len2;j++)
{
if(s1[i]==s2[j]) dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
int x=len1,y=len2;
int len=len1+len2-dp[len1][len2];s[len+1]='\0';
while(dp[x][y]!=0)
{
if(dp[x][y]==dp[x-1][y]) {s[len--]=s1[x];x--;}
else if(dp[x][y]==dp[x][y-1]) {s[len--]=s2[y];y--;}
else if(dp[x][y]==dp[x-1][y-1]+1) {s[len--]=s1[x];x--;y--;}
}
while(x!=0) s[len--]=s1[x--];
while(y!=0) s[len--]=s2[y--];
printf("%s\n",s+1);
}
return 0;
}