SZSM面试题:写一个可以返回任意两个string串的最大公串的函数,语言不限

火鸟李国平 2006-06-19 11:41:42
可以写实例函数出来,也可以说说算法思路
...全文
3370 49 打赏 收藏 转发到动态 举报
写回复
用AI写文章
49 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
佩服态度认真的哥们!!
hun_kou_fan_chi 2006-12-30
  • 打赏
  • 举报
回复
要学啊
火鸟李国平 2006-12-28
  • 打赏
  • 举报
回复
学无止尽
danjiewu 2006-12-11
  • 打赏
  • 举报
回复
我没看到用suffix tree实现O(n)的解法,事实上我还是认为O(n)的解法是不存在的。
hafent 2006-12-10
  • 打赏
  • 举报
回复
mark
MagicPeng 2006-12-09
  • 打赏
  • 举报
回复
强人们! 学习!
lobatt 2006-12-09
  • 打赏
  • 举报
回复
崇拜为了一个bbs上的题目认真写代码的人,bs就知道说别人烂的人!

这道题我认为楼主应该指名一下,公共串到底指什么

如果只是相同的连续字符串的话,那么kmp和suffix tree都是很好的算法
事实上suffix tree是编译器在做语法分析时使用的方法

但是如果公共串指的是公共子序列的话,就必须要使用LCS算法了,kmp和suffix tree在这种情况下都不能满足要求。
LCS算法寻找最长公共子序列长度的复杂度为0(mn)//设两个字符串长度分别为m和n
构造解串的复杂度为O(m+n)
复杂度比较高,因此如果楼主指的是第一种情况LCS就有点牛刀杀鸡了...
lxbetty 2006-12-09
  • 打赏
  • 举报
回复
那个说别人烂的兄弟,怎么不见你贴代码或者思路出来啊.......
天涯孤棹 2006-12-08
  • 打赏
  • 举报
回复
确实,井蛙之见,巨汗,呵呵
yihucha166 2006-11-21
  • 打赏
  • 举报
回复
mark
]]>
mark
liuchangyan 2006-11-19
  • 打赏
  • 举报
回复
mark
跳蚤图 2006-11-17
  • 打赏
  • 举报
回复
package sun;

public class testbuffer {

/**
* @param args
*/
public static void main(String[] args) {
Max("i am a","i am a student");

}
public static void Max(String s1,String s2){
StringBuffer s=new StringBuffer();
if(s1.equals(s2))
s.append(s1);
else if(s1.length()>s2.length()){
int i=0;
while(i<s2.length()){
if(s1.charAt(i)==s2.charAt(i))
s.append(s1.charAt(i));
i++;
}
System.out.println(s);
}
else{
int i=0;
while(i<s1.length()){
if(s1.charAt(i)==s2.charAt(i))
s.append(s1.charAt(i));
i++;
}
System.out.println(s);
}
}

}
jie00677 2006-11-12
  • 打赏
  • 举报
回复
mark
guohui4321 2006-11-09
  • 打赏
  • 举报
回复
哇,天书
我觉得这个方法很好
goodzzp() ( ) 信誉:100 Blog 2006-11-8 19:21:19 得分: 0



Longest common substring
最大公共子字符串

它和LCS是不同的,子字符串的位置是连续的。比如,对于ABAB和BABA来说,其最大公共子字符串就是ABA。计算方法为:
LCSuff[i,j] = LCSuff[i-1,j-1] +1, x(i)=y(j)
0 , otherwise
那么,最后的结果为:
LCSuff(x,y) = max(LCSuff[|x|,i]) i = 0 .. |y|。
比如:
A B A B
0 0 0 0 0
B 0 0 1 0 1
A 0 1 0 2 0
B 0 0 2 0 3
A 0 1 0 3 0
最下面一行的最大值就是结果。

这是我从我的笔记中拷贝过来的一段。这个显然是一个十分经典的问题了。




hziee_ 2006-11-09
  • 打赏
  • 举报
回复
mark
HoBoss 2006-11-08
  • 打赏
  • 举报
回复
mark
housisong 2006-11-08
  • 打赏
  • 举报
回复
to danjiewu(阿丹):
不要想当然,建议看一下前面的人的回复,了解一下:suffix tree
也可以搜索“后缀树”“后缀数组”“珍珠字符串”,你可以学到一种强大的工具;在字符串匹配、搜索、压缩算法、搜索引擎中都可以找到应用;
goodzzp 2006-11-08
  • 打赏
  • 举报
回复
suffix tree
后缀树
后缀树利用一棵树来表达字符串所有可能的后缀。比如,BANANA所有可能的后缀有:BANANA, ANANA, NANA, ANA,NA,A 共6个。根据我的理解,后缀树最简单可以这么来构造:
1,首先写出所有的后缀;
2,根据这些字符串的第一个字母把它们进行分组,每个字符串属于一组;
3,继续对各个分组进行步骤2的操作,直到每个分组只有一个字符串为止;
4,按照radix tree的方式进行简化处理。
一般的说,在原始字符串后面加上一个结束符号$以把所有的结束点都放到叶子节点上。于是,根据上面的步骤,我们给BANANA的分组为:
1,加上$,得到BANANA$;
2,得到所有的6个后缀(单独的$省略):BANANA$,ANANA$,NANA$,ANA$,NA$,A$;
3,这些字符串中,按照第一个字母进行划分,得到如下结果:
*
A/ B| \N
ANANA$ BANANA$ NANA$
ANA$ NA$
A$
4,再对每个分类循环进行上述操作,最后得到的结果为:
*
A/ B| \N
* * *
$/ \N $| \A
A$ * BANANA$ *
A/ $/ \N
* NA$ *
$/ \N A/
ANA$ * *
A/ $/
* NANA$
$/
ANANA$
5,进行radix tree方式的简化:
*
A/ BANANA$| \NA
* BANANA$ *
$/ \NA $/ \NA$
A$ * NA$ NANA$
$/ \NA$
ANA$ ANANA$

可以看到,每个叶子节点都对应一个后缀字符串,而每个内节点没有任何信息,而每条边描述的是消耗的字符串。
其一般构造可以在o(m)内完成,m为最长字符串的长度。

Ukkonen's algorithm能在这个时间复杂度里面完成后缀树的构建工作,见E. Ukkonen. (1995). On-line construction of suffix trees. Algorithmica 14(3):249-260.


同样来自于我的笔记。
goodzzp 2006-11-08
  • 打赏
  • 举报
回复
Longest common substring
最大公共子字符串

它和LCS是不同的,子字符串的位置是连续的。比如,对于ABAB和BABA来说,其最大公共子字符串就是ABA。计算方法为:
LCSuff[i,j] = LCSuff[i-1,j-1] +1, x(i)=y(j)
0 , otherwise
那么,最后的结果为:
LCSuff(x,y) = max(LCSuff[|x|,i]) i = 0 .. |y|。
比如:
A B A B
0 0 0 0 0
B 0 0 1 0 1
A 0 1 0 2 0
B 0 0 2 0 3
A 0 1 0 3 0
最下面一行的最大值就是结果。

这是我从我的笔记中拷贝过来的一段。这个显然是一个十分经典的问题了。
danjiewu 2006-10-31
  • 打赏
  • 举报
回复
有一点可以肯定,复杂度绝对不是O(n)的。
加载更多回复(29)

33,008

社区成员

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

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