In a string S
of lowercase letters, these letters form consecutive groups of the same character.
For example, a string like S = "abbxxxxzyy"
has the groups "a"
, "bb"
, "xxxx"
, "z"
and "yy"
.
Call a group large if it has 3 or more characters. We would like the starting and ending positions of every large group.
The final answer should be in lexicographic order.
Example 1:
Input: "abbxxxxzzy"
Output: [[3,6]]
Explanation: "xxxx" is the single
large group with starting 3 and ending positions 6.
Example 2:
Input: "abc" Output: [] Explanation: We have "a","b" and "c" but no large group.
Example 3:
Input: "abcdddeeeeaabbbcd" Output: [[3,5],[6,9],[12,14]]
Note: 1 <= S.length <= 1000
這道題給了我們一個全小寫的字符串,說是重復出現的字符可以當作一個群組,如果重復次數大於等於3次,可以當作一個大群組,讓我們找出所有大群組的起始和結束位置。那么實際上就是讓我們計數連續重復字符的出現次數,由於要連續,所以我們可以使用雙指針來做,一個指針指向重復部分的開頭,一個往后遍歷計數,只要不相同了就停止,然后看次數是否大於等3,是的話就將雙指針位置存入結果res中,並更新指針,參見代碼如下:
解法一:
class Solution { public: vector<vector<int>> largeGroupPositions(string S) { vector<vector<int>> res; int n = S.size(), i = 0, j = 0; while (j < n) { while (j < n && S[j] == S[i]) ++j; if (j - i >= 3) res.push_back({i, j - 1}); i = j; } return res; } };
我們也可以換一種寫法,不用while循環,而是使用for循環,但本質上還是雙指針的思路,並沒有什么太大的區別,參見代碼如下:
解法二:
class Solution { public: vector<vector<int>> largeGroupPositions(string S) { vector<vector<int>> res; int n = S.size(), start = 0; for (int i = 1; i <= n; ++i) { if (i < n && S[i] == S[start]) continue; if (i - start >= 3) res.push_back({start, i - 1}); start = i; } return res; } };
參考資料:
https://leetcode.com/problems/positions-of-large-groups/
https://leetcode.com/problems/positions-of-large-groups/discuss/128961/Java-Solution-Two-Pointers