社区
数据结构与算法
帖子详情
如何求一堆字符串的最长连续公共子串
ma3587
2009-10-26 09:24:11
淘宝面试题,没答出来
如:
abcdefg
abcef
cefg
那么答案是:ef
...全文
656
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
打赏
举报
回复
后缀数组?
最长
公共
子串
:给定两个
字符串
str1和str2,输出两个
字符串
的
最长
公共
子串
,如果
最长
公共
子串
为空,输出-1。
最长
公共
子串
和
最长
最长
公共
子序列不同的是
最长
公共
子串
要
求
必须是
连续
的。 题目 给定两个
字符串
str1和str2,输出两个
字符串
的
最长
公共
子串
,如果
最长
公共
子串
为空,输出-1。 输入描述: 输入包括两行,第一行代表
字符串
srr1,第二行代表
字符串
str2。\left( 1\leq length(str1),length(str2) \leq 5000 \right)(1≤length(str1),...
求
两个
字符串
的
最长
连续
公共
子串
这个问题和
求
公共
子序列LCS是类似的问题,相比之下,更加简单,因为要考虑
连续
性。 同样的,我们也可以用动态规划法
求
解,用一个数组C[m+1][n+1],C[i][j]代表
字符串
的前i个Mi和另一个
字符串
的前j个Nj的
最长
连续
公共
子串
的长度。 假设两个
字符串
M[0...m-1]和N[0...n-1] C[i][j] = 0, i=0或者j=0; C[i][j] = C[i-1][j-1
求
两个给定
字符串
的
公共
子串
给定一个query和一个text,均由小写字母组成。要
求
在text中找出以同样的顺序
连续
出现在query中的
最长
连续
字母序列的长度。例如,query为 "acbac",text为"acaccbabb",那么text中的"cba"为
最长
的
连续
出现在query中的字母序列,因此,返回结果应该为其长度3。请注意程序效率。 假设text的长度为m,query的长度为n,n小于等于m。 n中
子串
的
两个
字符串
的
最长
连续
公共
子串
LCS(Longest Common Subsequence) 就是
求
两个
字符串
最长
公共
子串
的问题。引入: LCS(Longest Common Subsequence) 就是
求
两个
字符串
最长
公共
子串
的问题。 比如: String str1 = new String("adbccadebbca"); String str2 = new String("edabccadece");str
最长
公共
子串
与
最长
连续
子串
算法
利用DP思想
数据结构与算法
33,025
社区成员
35,336
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章