原题:最长公共字符串
可以看看这个博主写的 sdut 1008 最大公共字串
我等弱渣只能加个注释学习学习。。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std;
int leftup=1,left=2,up=3;
int sum[110][110];
int pt[110][110];
char s[110][110];
int main()
{
int f(char s1[110],char s2[110]);
int i,j,n,m,t;
cin>>t;
while(t--)
{
cin>>n;
for(i=0;i<=n-1;i++)
{
scanf("%s",s[i]);
}
for(i=1;i<=n-1;i++)
{
m=f(s[0],s[i]); //一个一个的比比较
if(m==0)
{
break;
}
}
cout<<m<<endl;
}
return 0;
}
int f(char s1[110],char s2[110])
{
int l1=strlen(s1);
int l2=strlen(s2);
char s3[110];
int i,j,n,m,x,key,val,y,len,max;
memset(sum,0,sizeof(sum));
memset(pt,0,sizeof(pt));
for(i=1;i<=l1;i++)
{
for(j=1;j<=l2;j++)
{
max=0;
for(x=1;x<=3;x++) //两种状态 a[i]=b[j]:sum[i-1][j-1]+1 a[i]!=b[j]:sum[i-1][j]||sum[i][j-1]
{
if(x==1)
{
if(s1[i-1]==s2[j-1])
{
val=sum[i-1][j-1]+1;
}else
{
val=sum[i-1][j-1];
}
}else if(x==2)
{
val=sum[i][j-1];
}else
{
val=sum[i-1][j];
}
if(val>max)
{
max=val;
key=x; // key记录下取值的方式,以便还原最长公共字符串
}
}
sum[i][j]=max;
pt[i][j]=key;
}
}
x=l1; y=l2;
len=sum[l1][l2];
len-=1;
s3[sum[l1][l2]]='\0';
for(i=1;i<=sum[l1][l2];i++) //按照保存好的key还原字符串
{
while(s1[x-1]!=s2[y-1])
{
key=pt[x][y];
if(key==1)
{
x-=1; y-=1;
}else if(key==2)
{
y-=1;
}else
{
x-=1;
}
}
s3[len]=s1[x-1];
len-=1;
key=pt[x][y];
if(key==1)
{
x-=1; y-=1;
}else if(key==2)
{
y-=1;
}else
{
x-=1;
}
}
strcpy(s[0],s3); //将最长公共字符串赋给s[0]以便与后续字符串比较
return sum[l1][l2];
}