最長重複子串是指在乙個字串中找出最長的出現兩次或兩次以上的子串,例如abcdeabbcde,則bcde則是最長的重複子串。
最直觀的解法是窮舉所有的子串,和原串進行對比,從而選出最長的重複子串。
#include #include int commonlen(const char *str1, const char *str2)
while(*str1 && * str2 && *str1 == *str2)
return len;
}int lrs(const char *str)
int i, j;
int maxlen = 0, curlen = 0, maxindex = 0;
int len = strlen(str);
for(i = 0; i < len; i++)}}
for(i = 0; i < maxlen; i++)
return maxlen;
}int main()
這種演算法的效率是o(n^3),效率不高,使用過kmp演算法的同學會聯想到這其實就是在求next陣列的最大值問題,例如「abcdabcde」,它的next陣列為:
-1 0 0 0 0 1 2 3 4 0
各個子串的next陣列的最大值就是最長重複子串的長度。
#include #include #include int maxnext(const char *s, int _next)
}else
}return max;
}int lrs_kmp(const char *str)
}for(i = 0; i < max; i++)
return max;
}int main()
最長重複子串問題
今天面試被一道沒見過的題,完全整悶了。求一段字串的最長重複子串。後來網上看看部落格,竟然可以用kmp寫,為自己的無知感到羞愧。好吧,我來學習一下如何用kmp方法解決這樣的問題,關鍵是next的特性來解決這個問題。include include using namespace std int get ...
最長重複子串
首先這是乙個單字串問題。子字串r 在字串l 中至少出現兩次,則稱r 是l 的重複子串。重複子串又分為可重疊重複子串和不可重疊重複子串。方法 kmp演算法求解 在kmp演算法的關鍵就是求解next陣列,針對next j k,可以得到p 0,1,k 1 p j k,j k 1,j 1 看到p 0,1,k...
最長重複子串
思路 使用字尾陣列解決 分析 1 由於要求最長公共子串行,則需要找到字串的所有子串,即通過產生字串的字尾陣列實現。2 由於要求最長的重複子串,則需要對所有子串進行排序,這樣可以把相同的字串排在一起。3 比較 相鄰字串,找出兩個子串中,相同的字元的個數。注意,對於乙個子串,乙個與其重複最多的字串肯定是...