In a string S
of lowercase letters, these letters form consecutive groups of the same character.html
For example, a string like S = "abbxxxxzyy"
has the groups "a"
, "bb"
, "xxxx"
, "z"
and "yy"
.post
Call a group large if it has 3 or more characters. We would like the starting and ending positions of every large group.url
The final answer should be in lexicographic order.spa
Example 1:指針
Input: "abbxxxxzzy" Output: [[3,6]] Explanation: large group with starting 3 and ending positions 6. "xxxx" is the single
Example 2:code
Input: "abc" Output: [] Explanation: We have "a","b" and "c" but no large group.
Example 3:orm
Input: "abcdddeeeeaabbbcd" Output: [[3,5],[6,9],[12,14]]
Note: 1 <= S.length <= 1000
htm
這道題給了咱們一個全小寫的字符串,說是重複出現的字符能夠看成一個羣組,若是重複次數大於等於3次,能夠看成一個大羣組,讓咱們找出全部大羣組的起始和結束位置。那麼實際上就是讓咱們計數連續重複字符的出現次數,因爲要連續,因此咱們能夠使用雙指針來作,一個指針指向重複部分的開頭,一個日後遍歷計數,只要不相同了就中止,而後看次數是否大於等3,是的話就將雙指針位置存入結果res中,並更新指針,參見代碼以下:blog
解法一:leetcode
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