最长公共子序列,用map对输入的字符串进行处理之后就只是一个LCS了.最后通过递归求出路径就搞定了.
#include <iostream>
#include <map>
#include <cstdio>
#include <cstring>
#include <cmath>
#define MAXN 105
using namespace std;
int a[MAXN],b[MAXN];
int tem[MAXN];
int dp[MAXN][MAXN];
int path[MAXN];
int va[MAXN],vb[MAXN];
int main()
{
string s;
int i,j;
while(cin>>s)
{
if(s=="#")
{
cout<<"0"<<endl;
continue;
}
int si=1,as=1,bs=1;
map<string ,int> M;
M[s]=si++;
a[as++]=M[s];
while(cin>>s)
{
if(s=="#") break;
if(M[s]==0)
{
M[s]=si++;
}
a[as++]=M[s];
}
while(cin>>s)
{
if(s=="#") break;
if(M[s]==0)
{
M[s]=si++;
}
b[bs++]=M[s];
}
int pa=0;
memset(dp,0,sizeof(dp));
memset(path,0,sizeof(path));
for(i=1;i<as;i++)
{
for(j=1;j<bs;j++)
{
if(a[i]==b[j])
{
dp[i][j]=dp[i-1][j-1]+1;
}
else
{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
i=as-1;j=bs-1;
while(i>0&&j>0)//循环得到路径
{
if(dp[i][j]==dp[i-1][j])
i--;
else if(dp[i][j]==dp[i][j-1])
j--;
else
{
path[pa++]=a[i];
i--;j--;
}
}
int flag=0;
map<string,int>::iterator iter;
for(i=pa-1;i>=0;i--)
{
for(iter=M.begin();iter!=M.end();iter++)
{
if(iter->second==path[i])
{
if(flag) cout<<" ";
flag=1;
cout<<iter->first;
}
}
}
cout<<endl;
}
return 0;
}