2021-01-05 | 830. 較大分組的位置
阿新 • • 發佈:2021-01-06
技術標籤:2021 LeetCode每日一題字串指標資料結構leetcodeJavaScript
1. 題目描述
在一個由小寫字母構成的字串 s 中,包含由一些連續的相同字元所構成的分組。
例如,在字串 s = "abbxxxxzyy"
中,就含有 "a"
, "bb"
, "xxxx"
, "z"
和 "yy"
這樣的一些分組。
分組可以用區間 [start, end]
表示,其中 start
和 end
分別表示該分組的起始和終止位置的下標。上例中的 “xxxx” 分組用區間表示為 [3,6] 。
我們稱所有包含大於或等於三個連續字元的分組為 較大分組 。
找到每一個 較大分組 的區間,按起始位置下標遞增順序排序後,返回結果。
示例 1:
輸入:s = "abbxxxxzzy"
輸出:[[3,6]]
解釋:"xxxx" 是一個起始於 3 且終止於 6 的較大分組。
示例 2:
輸入:s = "abc"
輸出:[]
解釋:"a","b" 和 "c" 均不是符合要求的較大分組。
示例 3:
輸入:s = "abcdddeeeeaabbbcd"
輸出:[ [3,5],[6,9],[12,14]]
解釋:較大分組為 "ddd", "eeee" 和 "bbb"
示例 4:
輸入:s = "aba"
輸出:[]
提示:
- 1 <= s.length <= 1000
- s 僅含小寫英文字母
2. 解題思路
(1)直接遍歷
對於這道題目,可以直接一趟進行遍歷。初始化一個num,用來儲存當前分組的長度。每次增加一個相同字元,num就加一。如果下一個字元和當前字元不同,或者是已經遍歷到字串尾部,就說明相同的字元已經遍歷完了。如果此時num滿足較大分組的條件,就其加入到結果中。
複雜度分析:
- 時間複雜度:O(n),其中 n 是字串的長度,只需要遍歷一次該陣列。
- 空間複雜度:O(1),只需要常數的空間來儲存若干變數,返回值不計入空間複雜度。
(2)雙指標
除了直接遍歷之外,我們還可以使用雙指標來實現這個題目。
- 初始化兩個指標 left 和 right 分比為0和1
- 只要 left 和 right 值相等,就向右移動 right 指標
- 如果 left 和 right 值不相等,就計算前面的相同字元的個數,判斷個數是否大於等於3:當滿足條件時,將對應的起始索引位置新增到結果列表中,維護更新 left = right;否則,直接更新 left = right。
複雜度分析:
- 時間複雜度:O(n),其中 n 是字串的長度,只需要遍歷一次該陣列。
- 空間複雜度:O(1),只需要常數的空間來儲存若干變數,返回值不計入空間複雜度。
3. 程式碼實現
(1)直接遍歷
/**
* @param {string} s
* @return {number[][]}
*/
var largeGroupPositions = function(s) {
let res = [], num = 1, len = s.length
for(let i = 0; i <= len; i++){
if(i === len - 1 || s[i] !== s[i + 1]){
if(num >= 3){
res.push([i - num + 1, i])
}
num = 1
}else{
num++
}
}
return res
};
(2)雙指標
/**
* @param {string} s
* @return {number[][]}
*/
var largeGroupPositions = function(s) {
let res = [], len = s.length, left = 0, right = 1
while(right <= len){
if(right === len || s[left] !== s[right]){
if(right - left >= 3){
res.push([left, right - 1])
}
left = right
}
right += 1
}
return res
};
4. 提交結果
(1)直接遍歷
(2)雙指標