//给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。 
//
// 示例 1: 
//
// 
//输入: "abab"
//
//输出: True
//
//解释: 可由子字符串 "ab" 重复两次构成。
// 
//
// 示例 2: 
//
// 
//输入: "aba"
//
//输出: False
// 
//
// 示例 3: 
//
// 
//输入: "abcabcabcabc"
//
//输出: True
//
//解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)
// 
// Related Topics 字符串 
// 👍 499 👎 0

/*
* 459 重复的子字符串
* 2021-06-11 19:57:37
* @author oxygenbytes
*/ 
#include "leetcode.h" 
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        int n = s.size();
        // next数组
        vector<int> next(n);
        next[0] = -1;
        int j = -1;
        // 注意i从1开始
        for(int i = 1;i < n;i++){
          while(j > -1 && s[i] != s[j+1]) j = next[j];
          if(s[i] == s[j+1]) j++;
          next[i] = j;
        }
        // next[n-1] - 1 减1是因为从-1开始计算
        return next[n-1] != -1 && n % (n - next[n-1] - 1) == 0;
    }
};
//leetcode submit region end(Prohibit modification and deletion)