459. 重复的子字符串

98 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第22天,点击查看活动详情

一、题目描述:

459. 重复的子字符串

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

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

二、思路分析:

假设字符串s是由s1+s2组成的,s+s后,str就变成了s1+s2+s1+s2,去掉首尾,破环了首尾的s1和s2,变成了s3+s2+s1+s4,此时str中间就是s2+s1,如果s是循环字串,也就是s1=s2,所以str中间的s2+s1就和原字符串相等。如果s不是循环字串,s1!=s2,那么s1+s2是不等于s2+s1的,也就是str中间不包含s。 如果只破坏了字符串首,那么就变成了s3+s2+s1+s2,新字符串中又出现了s1+s2,所以无法判断原字符串s是否可重复。只破坏字符串尾部也是一样的道理,所以要去掉首尾。

三、AC 代码:

/**
 * @param {string} s
 * @return {boolean}
 */
var repeatedSubstringPattern = function(s) {
    const len = s.length;
    const mid = Math.floor(len / 2);
    for (let i = 1; i <= mid; i++) {
        if (len % i === 0) {
            let sub = s.substring(0, i);
            if (sub.padEnd(len, sub) === s) {
                return true;
            }
        }
    }
    return false;
};

四、总结:

暴力的话 时间复杂度太高了

范文参考

「代码随想录」带你搞定字符串!459. 重复的子字符串:【KMP经典问题】 - 重复的子字符串 - 力扣(LeetCode)

459. 重复的子字符串——C语言,暴力枚举 - 重复的子字符串 - 力扣(LeetCode)

简单明了!!关于java两行代码实现的思路来源 - 重复的子字符串 - 力扣(LeetCode)