給定一個字符串,求出這個字符串的最長重複字串,例如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中堆砌重複關鍵詞的問題。
參考文獻: