【题目】
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。
示例 1:
输入: "abab"
输出: True
解释: 可由子字符串 "ab" 重复两次构成。
示例 2:
输入: "aba"
输出: False
示例 3:
输入: "abcabcabcabc"
输出: True
解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)
【思路】
对于子字符串,判断其长度是否小于原字符串的长度,并且能被后者整除,两者都满足(不满足条件,肯定不会是符合要求的子串,不用进行下一步操作),继续判断子字符串是否能重复几次构成原字符串。
【代码】
python版本
class Solution(object):
def repeatedSubstringPattern(self, s):
"""
:type s: str
:rtype: bool
"""
length = len(s)
# 特殊情况
if length == :
return False
for i in range(length / + ):
# 能被整除,前后相同
if length % (i+) == and s[:i+] == s[-(i+):]:
# 完全相同
num = length / (i+)
if num > and s[:(i+)] * num == s:
return True
return False
C++版本
class Solution {
public:
bool repeatedSubstringPattern(string s) {
// 特殊情况
if(s.size() == )
return false;
string str = "";
for(int i=; i <= s.size()/; i++){
str = s.substr(, i+);
if(s.size() % (i+) == && s.size() > (i+)){
int j=i+;
for(; j<s.size(); j++){
if(s[j] != s[j % (i+)])
break;
}
// cout << i << " " << s[i] << " " << s[j] << endl;
// 正常退出,满足条件
if(j == s.size())
return true;
}
}
return false;
}
};