重复的子字符串
next 數(shù)組記錄的就是最長(zhǎng)相同前后綴的集合。
如果 next[len - 1] != 0,則說(shuō)明字符串有最長(zhǎng)相同的前后綴(就是字符串里的前綴子串和后綴子串相同的最長(zhǎng)長(zhǎng)度)。
next數(shù)組中最長(zhǎng)相等前后綴的長(zhǎng)度為:next[len - 1] 。
數(shù)組長(zhǎng)度為:len。
如果len % (len - (next[len - 1])) == 0 ,則說(shuō)明 (數(shù)組長(zhǎng)度-最長(zhǎng)相等前后綴的長(zhǎng)度) 正好可以被 數(shù)組的長(zhǎng)度整除,說(shuō)明有該字符串有重復(fù)的子字符串。
「強(qiáng)烈建議大家把next數(shù)組打印出來(lái),看看next數(shù)組里的規(guī)律,有助于理解KMP算法」
class Solution { public:void getNext(int* next,string& s){int j=0;next[0]=j;for(int i=1;i<s.size();i++){while(j>0 && s[i]!=s[j]){j=next[j-1];}if(s[i]==s[j]) j++;next[i]=j;}}bool repeatedSubstringPattern(string s) {int next[s.size()];getNext(next,s);if(next[s.size()-1]!=0){//說(shuō)明字符串有最長(zhǎng)相同的前后綴int block=s.size()-next[s.size()-1];if(s.size()%block==0) return true;}return false;} };總結(jié)
- 上一篇: 实现strstr(****)
- 下一篇: 栈和队列的基础知识