[LeetCode]830. Positions of Large Groups 解题报告(C++)
题目描述
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]]
题目大意
- 一个字符串.若连续的字母为3个或3个以上.则称为一个
large group
. - 求出所有
large group
的起始,结束位置索引.
解题思路
方法1:
- 暴力方法: 双重循环遍历.找到连续的字符串.若 right-left>=2.加入结果中.
代码实现:
class Solution{
public:
vector<vector<int>> largeGroupPositions(string S) {
int size = S.size();
vector<vector<int>> res;
int left = 0, right = 0;
int i, j;
for (i = 0; i < size - 2; i++) {
left = i;
for (j = i + 1; j < size; j++) {
if (S[i] == S[j]) {
right = j;
i = j;
}
else {
break;
}
}
if (right - left >= 2) {
res.push_back({ left,right });
}
}
return res;
}
};
方法2:
- 写法更加优雅.
- For every groups, find its start index i and end index j - 1
- Group length is j - i, if it’s no less than 3, add (i, j) to result.
代码实现:
class Solution {
public:
vector<vector<int>> largeGroupPositions(string S) {
int i = 0, j = 0, size = S.size();
vector<vector<int>>res;
while (j<size){
while (j < size&&S[i] == S[j]) ++j;
if (j - i >= 3) {
res.push_back({ i, j - 1 });
}
i = j; // 最后i移动到j位置.新字符开始的位置.
}
return res;
}
};
小结
- 注意 索引的移动. 可以加速.