LeetCode:459重复的子字符串
给定一个非空的字符串
s
,检查是否可以通过由它的一个子串重复多次构成。示例 1:
输入: s = "abab" 输出: true 解释: 可由子串 "ab" 重复两次构成。示例 2:
输入: s = "aba" 输出: false示例 3:
输入: s = "abcabcabcabc" 输出: true 解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)提示:
1 <= s.length <= 104
s
由小写英文字母组成
小技巧:
把next数组求出后,依次嵌套求出所有的重复前后缀,然后从小到大判断,注意不要从大到小,因为绝大多数是小的满足大的绝对满足。
const int N=10010; class Solution { public: bool repeatedSubstringPattern(string s) { int ne[N]; int n=s.size(); for(int i=1,j=-1;i<n;i++){ while(j!=-1&&s[i]!=s[j+1]){ j=ne[j]-1; }if(s[i]==s[j+1]){ j++; } ne[i]=j+1; } if(!ne[n-1]){ return false; }else{ int o[N]; int cnt=0; while(ne[n-1]){ o[cnt++]=ne[n-1]; ne[n-1]=ne[ne[n-1]-1]; } for(int i=cnt-1;~i;i--){ int j=0; int k=o[i]; bool f=1; for(int l=0;l<n;l++){ if(j==k){ j=0; } if(s[l]!=s[j++]){ f=0; break; } } if(f&&j==k){ return true; } } return false; } } };