【刷题笔记】459. 重复的子字符串

126 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情

一、题目描述:

459. 重复的子字符串 - 力扣(LeetCode)

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

示例 1:

输入: s = "abab"
输出: true
解释: 可由子串 "ab" 重复两次构成。

示例 2:

输入: s = "aba"
输出: false

示例 3:

输入: s = "abcabcabcabc"
输出: true
解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)

提示:

  • 1 <= s.length <= 10^4
  • s 由小写英文字母组成

二、思路分析:

  1. 假设是重复而来,那么最少重复2次,所求基准字符串长度最多是n/2;
  2. 用循环,假设基准字符串长度为i, i依次为1,2,3,4,5,……n/2,
  3. 每次循环中,就从j=i+1的元素开始比较,和j-i位置元素比较,j依次后移一位,其实就是看基准字符串之后的元素是否依次与基准字符串对应,一旦出现不对应的,说明基准字符串不对,那么i++继续查看下一个长度的子字符串。
  4. 如果在检查某个长度的子字符串长度时,发现后面的字符串均与基准字符串一一对应,那么说明这个基准字符串即为所求子字符串

三、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)

重复的子字符串 - 重复的子字符串 - 力扣(LeetCode)

重复的子字符串(KMP算法在一个串中查找是否出现过另一个串) - 重复的子字符串 - 力扣(LeetCode)