这个也是求最长公共字串,只是相比Common Subsequence需要记录最长公共字串的构成,此时箭头的标记就用上了,在程序中,用d[][]存放标记,2表示朝向左上方,1表示指向上,-1表示指向左。S[][]存放当前最大字串长度。在求最优解时,顺着箭头从后向前寻找公共字串的序号,记录下来,输出即可。该算法在算法导论中有详细的讲解。
#include<iostream>
#include<string.h>
using namespace std;
char a[101][31],b[101][31],c[31];
int n,i,j,an,bn,d[101][101],s[101][101];
int main()
{
while(scanf("%s",&c)!=EOF)
{
if(strcmp(c,"#")==0)
{
n++;
}
if(n==0)
{
strcpy(a[++an],c);
}
else if(n==1)
{
strcpy(b[++bn],c);
}
else
{
memset(s,0,sizeof(s));
for(i=1;i<=an;i++)
{
for(j=1;j<=bn;j++)
{
if(strcmp(a[i],b[j])==0)
{
s[i][j]=s[i-1][j-1]+1;
d[i][j]=2;
}
else
{
if(s[i][j-1]>=s[i-1][j])
{
s[i][j]=s[i][j-1];
d[i][j]=-1; //向左
}
else
{
s[i][j]=s[i-1][j];
d[i][j]=1; //向上
}
}
}
}
for(i=an,j=bn;i>0&&j>0;)
{
if(d[i][j]==2)
{
s[0][s[i][j]]=i;
i--;
j--;
}
else if(d[i][j]==-1)
{
j--;
}
else
{
i--;
}
}
for(i=1;i<=s[an][bn];i++)
printf("%s ",a[s[0][i]]);
printf("/n");
an=0;
bn=0;
n=0;
}
}
return 0;
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/h15019901998/archive/2010/03/10/5365267.aspx