重複的子字符串
1.題目
給定一個非空的字符串,判斷它是否可以由它的一個子串重複多次構成。給定的字符串只含有小寫英文字母,並且長度不超過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
};