当前位置: 代码迷 >> C语言 >> 求字符串公共子串?
  详细解决方案

求字符串公共子串?

热度:274   发布时间:2007-06-21 08:54:53.0
求字符串公共子串?
求N个的最长公共子串,N<=20,字符串长度不超过255。
例如:N=3,由键盘依次输入三个字符串为
What is local bus ?
Name some local buses.
local bus is a high speed I/O bus close to the processer.
则最长为"local bus"。

在TC2.0下运行.
搜索更多相关的解决方案: 字符  

----------------解决方案--------------------------------------------------------

怎么没人回呀?是不是没人会呢?


----------------解决方案--------------------------------------------------------

这问题比较麻烦,要先比较出三个串里共同拥有的子串,算法比较麻烦,自己去看看KMP算法,懂了就会了,我现在都还在研究,好难懂。


----------------解决方案--------------------------------------------------------

哦,那我先去看一下呀,不过我有可能看不懂哟!
不知有没有人会?


----------------解决方案--------------------------------------------------------

#include <stdio.h>
#include <string.h>
#define MAXN 20
#define MAXL 256
int n;
int len[MAXN];
char str[MAXN][MAXL];

int match(char *s1,char *s2,int len)
{
while (len--)
{
if (*s1!=*s2) return 0;
s1++;
s2++;
}
return 1;
}

main()
{
int i,j;
int ans,ansi;
char line[100];
scanf("%d",&n);
gets(line);
for (i=0;i<n;i++)
{
gets(str[i]);
len[i]=strlen(str[i]);
}
ans=-1;
for (j=len[0];ans==-1 && j>0;j--)
for (i=0;ans==-1 && i+j-1<len[0];i++)
{
int flag1,k;
flag1=1;
for (k=1;flag1 && k<n;k++)
{
int flag2,s;
flag2=0;
for (s=0;!flag2 && s+j-1<len[k];s++)
if (match(str[0]+i,str[k]+s,j)) flag2=1;
if (!flag2) flag1=0;
}
if (flag1)
{
ans=j;
ansi=i;
}
}
if (ans==-1) puts("No common substrings!");
else
{
for (i=0;i<ans;i++) putchar(str[0][i+ansi]);
putchar('\n');
}
}

这个应该对吧!用的好好像是枚举法.


----------------解决方案--------------------------------------------------------
  相关解决方案