今天面試被一道沒見過的題,完全整悶了。求一段字串的最長重複子串。後來網上看看部落格,竟然可以用kmp寫,為自己的無知感到羞愧。好吧,我來學習一下如何用kmp方法解決這樣的問題,關鍵是next的特性來解決這個問題。
#include #includeusing
namespace
std;
int get_next(char *p, int
nextval)
else
j =nextval[j];
}return
maxlen;
}int
main()
}cout
<< "
輸出最長重複子串:
"
cout
<< s[i +maxindex];
cout
<}
使用kmp的特性來解決這道題,時間複雜度有點高啊。
事情總有解決的方法,所以就有了字尾陣列這一資料結構來解決這個方法。對乙個字串生成相應的字尾陣列後,再排序,排序後依次檢測相鄰的兩個字串的開頭部分。
#include #include#include
#include
using
namespace
std;
#define maxlen 10000
char str[maxlen], *arr[maxlen];
int callen(const
char *str1, const
char *str2)
int pstrcmp(const
void *str1, const
void *str2)
intmain()
str[n] = '\0'
; qsort(arr, n,
sizeof(char *), pstrcmp);
for(int i = 0; i < n - 1; i++)
}cout
<< arr[maxindex] <}
最長重複子串問題
最長重複子串是指在乙個字串中找出最長的出現兩次或兩次以上的子串,例如abcdeabbcde,則bcde則是最長的重複子串。最直觀的解法是窮舉所有的子串,和原串進行對比,從而選出最長的重複子串。include include int commonlen const char str1,const ch...
最長重複子串
首先這是乙個單字串問題。子字串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 比較 相鄰字串,找出兩個子串中,相同的字元的個數。注意,對於乙個子串,乙個與其重複最多的字串肯定是...