【筆記】JavaScript版數據結構與算法——基礎算法之“正則類”(459. 重複的子字符串)


重複的子字符串

1.題目

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

給定一個非空的字符串,判斷它是否可以由它的一個子串重複多次構成。給定的字符串只含有小寫英文字母,並且長度不超過10000。

示例 1:

輸入: “abab”
輸出: True
解釋: 可由子字符串 “ab” 重複兩次構成。

示例 2:

輸入: “aba”
輸出: False

示例 3:

輸入: “abcabcabcabc”
輸出: True
解釋: 可由子字符串 “abc” 重複四次構成。 (或者子字符串 “abcabc” 重複兩次構成。)

題目模板

/**
 * @param {string} s
 * @return {boolean}
 */
var repeatedSubstringPattern = function(s) {

};

2.思路分析

見題解

3.所用到的方法

代碼 說明
. 匹配除換行符以外的任意字符
\w 匹配字母或數字或下劃線
\s 匹配任意的空白符
\d 匹配數字
\b 匹配單詞的開始或結束
^ 匹配字符串的開始
$ 匹配字符串的結束
* 重複零次或更多次
+ 重複一次或更多次
? 重複零次或一次
{n} 重複n次
{n,} 重複n次或更多次
{n,m} 重複n到m次
\W 匹配任意不是字母,數字,下劃線,漢字的字符
\S 匹配任意不是空白符的字符
\D 匹配任意非數字的字符
\B 匹配不是單詞開頭或結束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou這幾個字母以外的任意字符

4.題解及優化

課程解法

var repeatedSubstringPattern = function (s) {
  return /^(\w+)\1+$/.test(s)
}
  • ^:正則匹配開始
  • (\w+)
    • ():小括號表示捕獲並記住
    • \w:匹配字母或數字或下劃線
    • +:匹配多次
  • \1+:返回最後的第1+個子捕獲匹配的子字符串(捕獲的數目以左括號計數)
  • $:正則匹配結束
    在這裏插入圖片描述

其他小夥伴的解法

字符串includes

假設字符串由 n 個相同子串組成, 重複、掐頭去尾後包含子串 2n - 2, 如果仍然包含原字符串即 2n - 2 > n,那就表示 n > 2

var repeatedSubstringPattern = function(s) {
  return (s + s).slice(1, -1).includes(s)
}

在這裏插入圖片描述

週期解法

週期串爲s, 那麼設定t表示最小週期, 數學中週期的表達式是

f(x+t)=f(x)

字符串中 ​s = item * count
那麼我們需要找到最小週期 t = item.length

var repeatedSubstringPattern = function(s) {
  let len = s.length
  let i = 1
  while (i <= len / 2) {
    if (len % i === 0 && s.slice(0, i).repeat(len / i) === s) {
      return true
    }
    i++
  }
  return false
};

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章