题意:
求所有字符串中的最长公共连续子序列
思路:
暴力:找出最短字符串,枚举所有长度
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char s[4010][210];
char a[210]; //存放临时 连续最长子序列
char b[210]; //存放最长连续子序列
int main()
{
int n;
while(~scanf("%d",&n) && n)
{
int f,minn=210;
for(int i=0;i<n;i++)
{
scanf("%s",s[i]);
int len = strlen(s[i]);
if(len<minn)
{
minn = len;
f = i;
}
}
memset(b,0,sizeof(b)); //初始化为空字符串
int k,flag = 0;
for(int i=minn;i>0;i--) //子串的长度
{
for(int j=0;j<=minn-i;j++) //子串的起始点
{
memset(a,0,sizeof(a)); //初始化为空字符串
memcpy(a,s[f]+j,i*sizeof(char)); // 将以s[0][j]为起点的i个字符复制给a
for(k=1;k<n;k++)
{
if( strstr(s[k],a)==NULL ) //检验s[k]中是否含有连续序列 a
break;
}
if(k==n) // 全部字符串中都含有连续序列 a
{
flag = 1;
if(b[0]=='\0') //第一次找到长度为 i 的连续子序列 直接复制
strcpy(b,a);
else //如果两连续子序列长度相同 把字典序小的复制给 b
{
if(strcmp(a,b)<0)
strcpy(b,a);
}
}
}
if(flag) //如果找到连续子序列就跳出循环
break;
}
if(!flag)
printf("IDENTITY LOST\n");
else
puts(b);
}
return 0;
}
还有一种方法是暴力+KMP:找出最短字符串,枚举所有长度,与其他字符串匹配