最長重複子串

2021-07-15 19:01:50 字數 562 閱讀 9405

首先這是乙個單字串問題。子字串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]=p[j-k,j-k+1,...,j-1]應該會眼前一亮,大腦頓時清醒些,這不就是重複子串嗎!由此求解最長重複子串就轉化為求解kmp演算法next陣列中的最大值(即max。

現在就是求解next陣列的問題了

int getnext(char *str,int *next)

} else

k=next[k];

} return max;

}int main() }

//輸出最長字串

cout<<"最長字串: ";

for (index=0;indexcout

}

最長重複子串

思路 使用字尾陣列解決 分析 1 由於要求最長公共子串行,則需要找到字串的所有子串,即通過產生字串的字尾陣列實現。2 由於要求最長的重複子串,則需要對所有子串進行排序,這樣可以把相同的字串排在一起。3 比較 相鄰字串,找出兩個子串中,相同的字元的個數。注意,對於乙個子串,乙個與其重複最多的字串肯定是...

求最長重複子串 和 最長不重複子串 思路

題目 求任意乙個字串中的所有最長重複字串和所有最長不重複子串 最長不重複子串的解法 設定乙個輔助資料結構 如map 記錄每個字元最後一次出現的位置 遍歷字串中的每個字元,如果在map中沒有出現,則不重複子串的長度 1,並更新最大字串的長度值 如果在map中已經出現過,則更新當前字元在map中的位置和...

最長重複子串問題

最長重複子串是指在乙個字串中找出最長的出現兩次或兩次以上的子串,例如abcdeabbcde,則bcde則是最長的重複子串。最直觀的解法是窮舉所有的子串,和原串進行對比,從而選出最長的重複子串。include include int commonlen const char str1,const ch...