1. 程式人生 > 其它 >No.830 LeetCode題目 “較大分組的位置”

No.830 LeetCode題目 “較大分組的位置”

技術標籤:LeetCode刷題字串leetcode演算法資料結構

題目描述

在一個由小寫字母構成的字串 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 僅含小寫英文字母

解題思路

2021的第一條部落格;

說來慚愧,也好久沒刷題了,今天LeetCode的每日一題不是很難,還是很照顧我的。

這道題主要是記錄相同長度大於等於3的陣列的起點和終點即可。有兩個地方可以考慮一下:

  1. 只記錄終點(當前點)的下標即可。起始點的下標通過i - number + 1這種方法記錄就可以。
  2. 在迴圈裡先判斷是否要繼續遍歷,如果遍歷的話則++,不遍歷的話直接跳出即可。

注:vector<vector<int>>test這種陣列利用push_back({start, end})實現即可。

具體程式碼

class Solution {
public:
    vector<vector<int>> largeGroupPositions(string s) {
        int length = s.size();
        vector<vector<int>>result;

        //if s is empty, return null
        if(length == 0){
            return result;
        }
        
        int number = 1;
        for(int i = 0; i < length; i++){
            //if the string to the end or the next char is different, stop calculating.
            if(i == length - 1 || s[i] != s[i+1]){
                if(number >= 3){
                    result.push_back({i - number + 1, i});
                }
                //reset the number
                number = 1;
            }
            else number++;                        
        }
        return result;
    }
};

效能結果

在這裡插入圖片描述