题干:
代码:
class Solution {
public:void getNext(int *next, string &s){int j = 0;next[0] = 0;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 len = s.size();if(len == 0){return false;}int next[len];getNext(next, s);if(next[len - 1] != 0 && (len % (len - next[len - 1])) == 0){return true;}return false;}
};
涉及到小串与大串的匹配时可用kmp算法,当一个字符串由重复子串组成的,最长相等前后缀不包含的子串就是最小重复子串。
为什么会判断next[len - 1] != 0:
如果去掉 next[len-1] != 0
的判断,即使 next[len - 1] 为 0,只要 len 可以被自己整除(显然所有数字都可以),这个函数都会返回 true,这显然是不正确的。例如,对于字符串 "a",其 next 数组为 [0]
,这时去掉 next[len-1] != 0
的判断,则会错误地返回 true
,因为 1 % (1 - 0) == 0,尽管实际上该字符串并不包含任何重复的子字符串模式。
请记住getNextz中的i是从1开始的!
请记住getNextz中的i是从1开始的!
请记住getNextz中的i是从1开始的!
请记住getNextz中的i是从1开始的!
请记住getNextz中的i是从1开始的!
请记住getNextz中的i是从1开始的!