您的位置:首页 > 其它

求多字符串的最长公共子串(POW)

2012-10-11 21:35 148 查看

求多字符串的最长公共子串(POW)

给定n个字符串,求这n个字符串的最长公共子串。例如给3个字符串:'abcb'、'bca'和'acbc',则这三个字符串的最长公共子串即为'bc'。输入第一行为n,下面n行即为这n个字符串。输出它们的最长公共子串。

样例:

输入:

输出:

3

abcb

bca

acbc

bc

View Code

#include<stdio.h>
#include<string.h>

char POW[200][200];
char S[200];
char T[200];
int len[200];
int nextval[256];
int length_1;
int ma;
int length;
int n;
int ans;

void get_nextval( )
{//求模式串T的next函数修正值并存入数组nextval.
int i=0;
int j=1;
int length;
nextval[0]=-1;
nextval[1]=0;
length=strlen(T);

while(j<length)
{
if(i==-1||T[j]==T[i])
{
++i;
++j;
if(T[j]==T[i])
nextval[j]=nextval[i];
else
nextval[j]=i;
}
else
i=nextval[i];
}
/*    for( i=0; i<strlen(T);i++ )
printf("%d ",nextval[i]);
printf("\n");*/
}

void KMP( )
{
int i;
int j;
int k;
int m;
ma=200;
get_nextval( );
for( k=1; k<n; k++ )
{
i=0;
j=0;
m=0;
while( j<length_1 && i < len[k] )
{
if( j==-1 || POW[k][i]==T[j] )
{
++i;
++j;            //继续比较后继字符
}
else
j=nextval[j];  //模式串向后移动
if( j>m )
m=j;
}
if( m<ma )
ma = m;
}
}

int main( )
{
int i;
int j;
while( scanf("%d",&n) != EOF )
{
ans=0;
for( i=0; i<n; i++ )
{
scanf("%s",POW[i]);
len[i] = strlen(POW[i]);
}
for( i=0; i<len[0]; i++ )
{
strcpy(T,POW[0]+i);
length_1 = len[0]-i;
KMP( );
if( ma > ans )
{
ans = ma;
for( j=0; j<ans; j++ ) //记录公共子串
S[j] = T[j];
S[j] = '\0';
}
}
//    printf("%d\n",ans);
printf("%s\n",S);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐