题目介绍
给定一个非空的字符串 s
,检查是否可以通过由它的一个子串重复多次构成。
示例 1:
输入: s = "abab"
输出: true
解释: 可由子串 "ab" 重复两次构成。
示例 2:
输入: s = "aba"
输出: false
示例 3:
输入: s = "abcabcabcabc"
输出: true
解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)
提示:
1 <= s.length <= 104
s
由小写英文字母组成
解答
class Solution {
public:
// 法二: 把字符串s重复一次得到字符串t
// t去掉头尾字符串,若在t中还能找到s则表示可由重复子串构成
bool repeatedSubstringPattern(string s) {
string t = s + s;
t.erase(t.begin());
t.erase(t.end() - 1);
if(t.find(s) != string::npos) return true;
return false;
}
// 法一:bf
bool repeatedSubstringPattern1(string s) {
int n = s.size();
// 遍历重复串可能长度
for(int i = 1; i * 2 <= n; ++i)
{
if(n % i == 0) // 能被整除才可能重复构成串s
{
bool match = true;
for(int j = i; j < n; ++j)
{
// abcabc ,i = 3
// j-i = 0 ~ n - 4 , j = 3 ~ n-1
if(s[j] != s[j - i]) // 可手动模拟,检查是否为重复串
{
match = false;
break;
}
}
if(match) return true;
}
}
return false;
}
};