1. 程式人生 > 其它 >2021-01-05 | 830. 較大分組的位置

2021-01-05 | 830. 較大分組的位置

技術標籤:2021 LeetCode每日一題字串指標資料結構leetcodeJavaScript

1. 題目描述

在一個由小寫字母構成的字串 s 中,包含由一些連續的相同字元所構成的分組。

例如,在字串 s = "abbxxxxzyy" 中,就含有 "a", "bb", "xxxx", "z""yy" 這樣的一些分組。

分組可以用區間 [start, end] 表示,其中 startend 分別表示該分組的起始和終止位置的下標。上例中的 “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)雙指標
在這裡插入圖片描述