Skip to content

459. 重复的子字符串

js
;(function () {
  /**
   * 459. 重复的子字符串
   * 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。
   *
   * 输入: s = "abab"
   * 输出: true
   * 解释: 可由子串 "ab" 重复两次构成。
   *
   * 输入: s = "aba"
   * 输出: false
   *
   * 输入: s = "abcabcabcabc"
   * 输出: true
   * 解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)
   *
   */

  function repeatedSubstringPattern(s: string): boolean {
    // 方法一: -------------- 耗时太长 -------------------------
    // let len = s.length;
    // // 重复:则表示至少有2个子串,遍历时不能超过总长度的一半
    // let mid = Math.ceil(len / 2);
    // // 长度小于2肯定不满足条件,直接返回false
    // if (len < 2) return false;
    // // 遍历:如果以当前字符全局替换【s】为空字符串,返回的结果为空,则表示满足条件
    // for (let i = 1; i <= mid; i++) {
    //     let curStr = s.substring(0, i);
    //     let replaceRes = s.replace(new RegExp(curStr, 'g'), '')
    //     if (!replaceRes) {
    //         return true;
    //     }
    // }
    // return false

    // 方法二:
    let len = s.length
    // 重复:则表示至少有2个子串,遍历时不能超过总长度的一半
    let mid = Math.ceil(len / 2)
    // 长度小于2肯定不满足条件,直接返回false
    if (len < 2) return false
    // 遍历:
    for (let i = 1; i <= mid; i++) {
      let curStr = s.substring(0, i)
      let repeatNum = Math.floor(len / curStr.length)
      if (curStr.repeat(repeatNum) === s) {
        return true
      }
    }
    return false
  }

  const s1 = 'abab'
  const s2 = 'aba'
  const s3 = 'abcabcabcabc'
  const s4 = 'babbabbabbabbab'
  console.log(repeatedSubstringPattern(s1))
  console.log(repeatedSubstringPattern(s2))
  console.log(repeatedSubstringPattern(s3))
  console.log(repeatedSubstringPattern(s4))
})()