思路:使用字尾陣列解決
分析:1、由於要求最長公共子串行,則需要找到字串的所有子串,即通過產生字串的字尾陣列實現。
2、由於要求最長的重複子串,則需要對所有子串進行排序,這樣可以把相同的字串排在一起。 3、
比較
相鄰字串,找出兩個子串中,相同的字元的個數。
注意,對於乙個子串,乙個與其重複最多的字串肯定是緊挨著自己的兩個字串。
步驟:1、對待處理的字串產生字尾陣列
2、對字尾陣列排序
3、依次檢測相鄰兩個字尾的公共長度
4、取出最大公共長度的字首
舉例:輸入字串 banana
1、字串產生的字尾陣列:
a[0]:banana
a[1]:anana
a[2]:nana
a[3]:ana
a[4]:na
a[5]:a
2、對字尾陣列進行快速排序,以將字尾相近的(變位詞)子串集中在一起
a[0]:a
a[1]:ana
a[2]:anana
a[3]:banana
a[4]:na
a[5]:nana
之後可以依次檢測相鄰兩個字尾的公共長度並取出最大公共的字首
#include #include #include #include //#include "customer.h"
using namespace std;
int mycmp(const void *p1, const void *p2)
int getlen(char *p, char *q)
//最長重複子串,字尾陣列
int getmaxrepeatsubstr(string str)
delete s;
delete suffix;
return maxlen;
}int main()
return 0;
}
最長重複子串
首先這是乙個單字串問題。子字串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...
求最長重複子串 和 最長不重複子串 思路
題目 求任意乙個字串中的所有最長重複字串和所有最長不重複子串 最長不重複子串的解法 設定乙個輔助資料結構 如map 記錄每個字元最後一次出現的位置 遍歷字串中的每個字元,如果在map中沒有出現,則不重複子串的長度 1,並更新最大字串的長度值 如果在map中已經出現過,則更新當前字元在map中的位置和...
最長重複子串問題
最長重複子串是指在乙個字串中找出最長的出現兩次或兩次以上的子串,例如abcdeabbcde,則bcde則是最長的重複子串。最直觀的解法是窮舉所有的子串,和原串進行對比,從而選出最長的重複子串。include include int commonlen const char str1,const ch...