459. 重复的子字符串
题目描述:
给定一个非空的字符串 s s s ,检查是否可以通过由它的一个子串重复多次构成。
示例:
示例 1:
输入:s = “abab”
输出:true
解释:可由子串 “ab” 重复两次构成。
示例 2:
输入:s = “aba”
输出:false
示例 3:
输入:s = “abcabcabcabc”
输出:true
解释:可由子串 “abc” 重复四次构成。 (或子串 “abcabc” 重复两次构成。)
方法
数学公式
如果一个长度为 n n n 的字符串 s s s 可以由它的一个长度为 n ′ n' n′ 的子串 s ′ s' s′ 重复多次构成,那么:
- n n n 一定是 n ′ n' n′的倍数;
- s ′ s' s′ 一定是 s s s 的前缀;
- 对于任意的 i ∈ [ n ′ , n ) i \in [n', n) i∈[n′,n),有 s [ i ] = s [ i − n ′ ] s[i] = s[i-n'] s[i]=s[i−n′]。
C++
枚举
class Solution {
public:
bool repeatedSubstringPattern(string s) {
int len=s.size();
for(int n=2;n<=len;n++){
if(len%n!=0)
continue;
int l=len/n;
string t=s.substr(0,l);
bool flag=true;
for(int i=l;i<len;i+=l){
if(t.compare(s.substr(i,l))!=0){
flag=false;
break;
}
}
if(flag)
return true;
}
return false;
}
};
字符串匹配
class Solution {
public:
bool repeatedSubstringPattern(string s) {
string str=s+s;
return str.find(s,1)!=s.size();
}
};
Java
枚举
class Solution {
public boolean repeatedSubstringPattern(String s) {
int len=s.length();
for(int n=2;n<=len;n++){
if(len%n!=0)
continue;
int l=len/n;
String t=s.substring(0,l);
boolean flag=true;
for(int i=l;i<len;i+=l){
if(!t.equals(s.substring(i,i+l))){
flag=false;
break;
}
}
if(flag)
return true;
}
return false;
}
}
字符串匹配
class Solution {
public boolean repeatedSubstringPattern(String s) {
String str=s+s;
return str.substring(1,str.length()-1).contains(s);
}
}