No.830 LeetCode題目 “較大分組的位置”
阿新 • • 發佈:2021-01-06
技術標籤:LeetCode刷題字串leetcode演算法資料結構
題目描述
在一個由小寫字母構成的字串 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 僅含小寫英文字母
解題思路
2021的第一條部落格;
說來慚愧,也好久沒刷題了,今天LeetCode的每日一題不是很難,還是很照顧我的。
這道題主要是記錄相同長度大於等於3的陣列的起點和終點即可。有兩個地方可以考慮一下:
- 只記錄終點(當前點)的下標即可。起始點的下標通過
i - number + 1
這種方法記錄就可以。 - 在迴圈裡先判斷是否要繼續遍歷,如果遍歷的話則++,不遍歷的話直接跳出即可。
注: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;
}
};