1、题目描述
给定一个非空的字符串 s
,检查是否可以通过由它的一个子串重复多次构成。
2、示例
示例 1:
输入: s = "abab" 输出: true 解释: 可由子串 "ab" 重复两次构成。
示例 2:
输入: s = "aba" 输出: false
示例 3:
输入: s = "abcabcabcabc" 输出: true 解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)
3、题解
解法一:
暴力法,不断遍历子串可能的长度从1到length/2,然后对这个子串不断去找s匹配,如果完全匹配上,这个子串就是重复子串。
解法二:
如果您的字符串 S 包含一个重复的子字符串,那么这意味着您可以多次 “移位和换行”`您的字符串,并使其与原始字符串匹配。
例如:abcabc
移位一次:cabcab
移位两次:bcabca
移位三次:abcabc
现在字符串和原字符串匹配了,所以可以得出结论存在重复的子串。因此还是不断遍历子串可能的长度从1到length/2,但是只要判断s.substr(length,s.size()-length)+s.substr(0,length)==s说明这个子串就是重复子串。
class Solution {
public:
bool repeatedSubstringPattern(string s) {
for(int length=1;length<=s.size()/2;length++){
if(s.substr(length,s.size()-length)+s.substr(0,length)==s){
return true;
}
}
return false;
}
};
class Solution1 {
public:
bool repeatedSubstringPattern(string s) {
for(int length=1;length<=s.size()/2;length++){
string t=s.substr(0,length);
int start=0;
bool is_find=true;
while(start<s.size()){
if(start+length>s.size() || t!=s.substr(start,length)){
is_find =false;
break;
}
start+=length;
}
if(is_find) return true;
}
return false;
}
};