社区
数据结构与算法
帖子详情
如何求一堆字符串的最长连续公共子串
ma3587
2009-10-26 09:24:11
淘宝面试题,没答出来
如:
abcdefg
abcef
cefg
那么答案是:ef
...全文
600
11
打赏
收藏
如何求一堆字符串的最长连续公共子串
淘宝面试题,没答出来 如: abcdefg abcef cefg 那么答案是:ef
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
顶一个!
猫已经找不回了
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
打赏
举报
回复
后缀数组?
从“
公共
子串
”的角度来分析
求
解“
最长
公共
子序列”(LCS)
从“
公共
子串
”的角度来分析
求
解“
最长
公共
子序列”(LCS)
信息学奥赛一本通提高篇 第2部分
字符串
算法(提高篇) 数据点
信息学奥赛一本通提高篇 第2部分
字符串
算法(提高篇)
算法之《寻找最大重复
子串
》
忽然找到的贡献给大家,这个算法大家了解一下
数据结构 串的堆存储表示
串的堆存储表示 附带各种处理函数 附带测试函数
java20道非常经典的编程题
NULL 博文链接:https://luxiaofeng2006.iteye.com/blog/796935
数据结构与算法
33,024
社区成员
35,335
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章