wordpress免费绑定域名推推蛙贴吧优化
给定一个非空的字符串
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;}} };