给定一个字符串,求出这个字符串的最长重复字串,例如abcdbcd,最长重复字串是bcd。
分析:
方法1:
一种方法是先解决http://blog.csdn.net/bertzhang/article/details/7303010的问题,在对字符串进行循环处理。
具体过程如下:
1)首先解决两个字符串的最长公共邻接子串问题;
2)将字符串,abcdbcd分成如下两个字符串的集合:
“a" 和 "bcdbcd"
"ab"和“cdbcd"
"abc"和"dbcd"
"abcd"和"bcd"-->产生最大子串bcd
“abcdb"和"cd"
"abcdbc"和"d"
完毕。
算法的复杂度是O(n^3)
方法2:
通过后缀树来计算,循环将字符串拆分成:
abcdbcd
bcdbcd
cdbcd
dbcd
bcd
cd
d
构建一棵后缀树如下:
a-b-c-d-b-c-d
b-c-d-b-c-d
c-d-b-c-d
d
对于字符串bcd、cd等已经出现在后缀树中的字串,计算路径最长的一个字串,就是最长字串。
算法复杂度为O(n)
其实这个问题来源于web search spam中spamer在标题、anchor中堆砌重复关键词的问题。
参考文献: