實際上是求最長公共字串的,只不過它的表達讓人有點兒那啥……
在說一遍 關於最長連續公共字串的算法,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;
}