持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情
一、题目描述:
给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。
示例 1:
输入: s = "abab"
输出: true
解释: 可由子串 "ab" 重复两次构成。
示例 2:
输入: s = "aba"
输出: false
示例 3:
输入: s = "abcabcabcabc"
输出: true
解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)
提示:
- 1 <= s.length <= 10^4
- s 由小写英文字母组成
二、思路分析:
- 假设是重复而来,那么最少重复2次,所求基准字符串长度最多是n/2;
- 用循环,假设基准字符串长度为i, i依次为1,2,3,4,5,……n/2,
- 每次循环中,就从j=i+1的元素开始比较,和j-i位置元素比较,j依次后移一位,其实就是看基准字符串之后的元素是否依次与基准字符串对应,一旦出现不对应的,说明基准字符串不对,那么i++继续查看下一个长度的子字符串。
- 如果在检查某个长度的子字符串长度时,发现后面的字符串均与基准字符串一一对应,那么说明这个基准字符串即为所求子字符串
三、AC 代码:
bool repeatedSubstringPattern(char * s){
int n = strlen(s);
for(int i = 1; i*2<=n; i++){
if(n % i == 0){
bool flag = true;
for(int j = i; j<n; j++){
if(s[j] != s[j-i]){
flag = false;
break;
}
}
if(flag == true)
return true;
}
}
return false;
}
范文参考:
-C++ 力扣459. 重复的子字符串 ;暴力:将有可能的子串都拼凑成主串的样子再比较 - 重复的子字符串 - 力扣(LeetCode)