社区
数据结构与算法
帖子详情
如何求一堆字符串的最长连续公共子串
ma3587
2009-10-26 09:24:11
淘宝面试题,没答出来
如:
abcdefg
abcef
cefg
那么答案是:ef
...全文
611
11
打赏
收藏
如何求一堆字符串的最长连续公共子串
淘宝面试题,没答出来 如: abcdefg abcef cefg 那么答案是:ef
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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)
最长
公共
子序列(Longest Common Subsequence,简称LCS)是计算机科学中一个经典的问题,主要涉及
字符串
处理和算法设计。在这个问题中,我们需要找到两个或多个
字符串
的
最长
子序列,这个子序列并不一定是
连续
的,但...
信息学奥赛一本通提高篇 第2部分
字符串
算法(提高篇) 数据点
3. **动态规划**:在处理
字符串
问题时,动态规划经常被用来解决
最长
公共
子串
、
最长
重复
子串
、编辑距离等问题。理解状态转移方程和边界条件对于掌握这类问题至关重要。 4. **
字符串
hash**:通过计算
字符串
的哈希值,...
算法之《寻找最大重复
子串
》
一个基础的解决方法是采用滑动窗口的思想,遍历
字符串
并维护一个窗口,每次移动窗口时检查窗口内的
子串
是否在原
字符串
的其他位置重复出现。然而,这种方法的时间复杂度较高,为O(n^3),对于大规模数据并不适用。 ...
数据结构 串的堆存储表示
在实际应用中,堆存储的串可能还有其他高级功能,如搜索
子串
、计算
最长
公共
子串
等,这些都需要根据具体需
求
进行实现。 总结来说,“串的堆存储表示”是一种巧妙的数据结构设计,它结合了串的特性与堆的优点,为字符...
java20道非常经典的编程题
- 找出一组
字符串
的
最长
公共
前缀,可以通过比较每个
字符串
的字符来实现。 11. **LRU缓存**: - 实现一个LRU(Least Recently Used)缓存机制,使用双向链表结合哈希表。 12. **有效的括号**: - 判断一个
字符串
...
数据结构与算法
33,028
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章