如何求一堆字符串的最长连续公共子串

ma3587 2009-10-26 09:24:11
淘宝面试题,没答出来

如:
abcdefg
abcef
cefg

那么答案是:ef
...全文
600 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
littlemonster 2009-10-29
  • 打赏
  • 举报
回复
可以用suffix arrays.

这有个包,好像能直接用哈~
http://www.cs.umd.edu/class/fall2004/cmsc132/p9/oop2/suffixTree/SuffixTree.html
huangbo0603 2009-10-28
  • 打赏
  • 举报
回复
顶一个!
  • 打赏
  • 举报
回复
1.对后缀数组排序,得出结果,因为是字符串,考虑基数排序。
2.参考我注释的这篇:
http://blog.csdn.net/hairetz/archive/2009/10/13/4664846.aspx
Damn_boy 2009-10-28
  • 打赏
  • 举报
回复
for()
{
KMP();
}
wangkefengyu 2009-10-28
  • 打赏
  • 举报
回复
写了一个求两个字符串的最大公共串
char* substr(char*str1,char*str2)
{
int i,j;
char*shortstr,*longstr;
char*sub;
if(str1==NULL||str2==NULL)
{
return NULL;
}
if(strlen(str1)>strlen(str2))
{
longstr=str1;
shortstr=str2;
}
else
{
longstr=str2;
shortstr=str1;
}
if(strstr(longstr,shortstr))//这个函数是用来判断短串是不是长串的子串
return shortstr;

sub = new char[(strlen(shortstr)+1)];
for(i=strlen(shortstr)-1;i>0;i--)
{
for(j=0;j<=strlen(shortstr)-i;j++)
{
memcpy(sub,&shortstr[j],i);
sub[i]='\0';
if(strstr(longstr,sub)!=NULL)
return sub;
}
}
return NULL;
}
bool strstr( char*src,char*sub)
{
char* src1;
char* sub1=sub;

while(*src!='\0')
{
src1=src;
sub1=sub;
while(*src1++==*sub1++)
{
if(*sub1=='\0')return true;
}

src=src+1;
}

return false;
}

void*memcpy(void*memto,const void*memfrom,size_t size)//这个函数如果是字符串的话 和strcpy()一个功能
{
//assert((memto!=NULL)&&assert(memfrom!=NULL));
char*tempfrom=(char*)memfrom;
char*tempto=(char*)memto;
while(size-->0)
*tempto++=*tempfrom++;
return memto;

}
void main()
{
char num1[20];
char num2[20];
char*ch=NULL;
cin>>num1;
cin>>num2;
ch=substr(num1,num2);
cout<<ch<<endl;
}
showjim 2009-10-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ma3587 的回复:]
多谢2楼,不过还有更简单的方法吗。后缀数组可以做吗?
[/Quote]
我处理字符串习惯于分裂子串处理,应该与具体的字符串匹配算法不冲突.
对于这类多串求公共子中的我还习惯于做预处理,扫描一次所有字符串,统计每个字符在每串中的唯一次数,只有次数等于串数量的字符才需要进一步处理(当没有字符满足条件时,在扫描过程中就结束了),其它字符将作为待删除字符,用于分割原始字符串.

比如示例中的cefg为有效字符,abd为无效字符,预处理后原始字符串{abcdefg,abcef,cefg}变成了{{c,efg},cef,cefg},预处理中的转换字符串并不是真实过程,这个过程是在实际匹配的时候进行的分裂操作
mengde007 2009-10-26
  • 打赏
  • 举报
回复
可用最小长度字符串和次小的比较;得出最小公共字串,然后和剩余的最小长度字符串比较;依次……
ma3587 2009-10-26
  • 打赏
  • 举报
回复
多谢2楼,不过还有更简单的方法吗。后缀数组可以做吗?
LeonTown 2009-10-26
  • 打赏
  • 举报
回复
A的各个子串集合,还需要比较

[Quote=引用 2 楼 sbwwkmyd 的回复:]
先找出长度最小的字符串A
用A去匹配其它字符串,要匹配所有长度的子串并将A分裂为一个子串集合
这个集合中最长的子串就是结果,如
cefg
:abcdefg => {efg,c}
:abcef => {ef,c}
=>ef
[/Quote]
showjim 2009-10-26
  • 打赏
  • 举报
回复
先找出长度最小的字符串A
用A去匹配其它字符串,要匹配所有长度的子串并将A分裂为一个子串集合
这个集合中最长的子串就是结果,如
cefg
:abcdefg => {efg,c}
:abcef => {ef,c}
=>ef
LeonTown 2009-10-26
  • 打赏
  • 举报
回复
后缀数组?

33,024

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧