实际上是求最长公共字串的,只不过它的表达让人有点儿那啥……
在说一遍 关于最长连续公共字串的算法,str1 str2 将str1 作为竖行,str2 作为横行,这样形成一个矩阵 map[l1][l2],先将map[0][i] 与 map[i][0]赋值,从i=1 j=1开始如果str1[i]==str2[j] 则map[i][j]=map[i-1][j-1]+1求最大的那个就是最长的公共字串长度,这道题是让求公共字串,我们记住最大的那个数的位置在向上遍历即可
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
#define max(a,b) (a)>(b)? (a):(b)
char a[55],b[55];
int map[55][55];
int l;
int main()
{
int i,j,n;
int max;
int flag;
cin>>n;
while(n--)
{
cin>>a;
memset(map,0,sizeof(map));
l=strlen(a);
j=0;
for(i=l-1;i>=0;i--)
{
b[j]=a[i];
j++;
}
for(i=0;i<l;i++)
{
if(a[0]==b[i])
map[0][i]=1;
if(b[0]==a[i])
map[i][0]=1;
}
max=1;
flag=0;
for(i=1;i<l;i++)
for(j=1;j<l;j++)
{
if(a[i]==b[j])
map[i][j]=map[i-1][j-1]+1;
if(max<map[i][j])
{
max=map[i][j];
flag=i;
}
}
for(i=flag-max+1;i<=flag;i++)
cout<<a[i];
cout<<endl;
}
return 0;
}