KMP

    给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。

    示例 1:
    输入: “abab”
    输出: True
    解释: 可由子字符串 “ab” 重复两次构成。

    示例 2:
    输入: “aba”
    输出: False

    示例 3:
    输入: “abcabcabcabc”
    输出: True
    解释: 可由子字符串 “abc” 重复四次构成。 (或者子字符串 “abcabc” 重复两次构成。)

    1. class Solution {
    2. public:
    3. void getNext (int* next, const string& s){
    4. next[0] = -1;
    5. int j = -1;
    6. for(int i = 1;i < s.size(); i++){
    7. while(j >= 0 && s[i] != s[j+1]) {
    8. j = next[j];
    9. }
    10. if(s[i] == s[j+1]) {
    11. j++;
    12. }
    13. next[i] = j;
    14. }
    15. }
    16. bool repeatedSubstringPattern (string s) {
    17. if (s.size() == 0) {
    18. return false;
    19. }
    20. int next[s.size()];
    21. getNext(next, s);
    22. int len = s.size();
    23. if (next[len - 1] != -1 && len % (len - (next[len - 1] + 1)) == 0) {
    24. return true;
    25. }
    26. return false;
    27. }
    28. };