题目描述:
在一个由小写字母构成的字符串 S
中,包含由一些连续的相同字符所构成的分组。
例如,在字符串 S = "abbxxxxzyy"
中,就含有 "a"
, "bb"
, "xxxx"
, "z"
和 "yy"
这样的一些分组。
我们称所有包含大于或等于三个连续字符的分组为较大分组。找到每一个较大分组的起始和终止位置。
最终结果按照字典顺序输出。
示例 :
输入: "abbxxxxzzy" 输出: [[3,6]] 解释: "xxxx" 是一个起始于 3 且终止于 6 的较大分组。
输入: "abc" 输出: [] 解释: "a","b" 和 "c" 均不是符合要求的较大分组。
输入: "abcdddeeeeaabbbcd" 输出: [[3,5],[6,9],[12,14]]
说明:
-
1 <= S.length <= 1000
方法分析:
首先,较大分组是指在字符串中包含三个及以上连续字符的分组。我们需要做的是找到每个较大分组,并将其起点索引和终点索引存入相应数组中。为此,我们遍历字符串,找到所有连续的子串;如果子串长度小于3,则不为较大分组,否则就是较大分组。对于较大分组,其起点和终点也好确定,即当前遍历索引值为终点值,当前遍历索引值 - 较大分组长度 即为起点值。
代码实现:
var largeGroupPositions = function(S) {
let result = [];
let count = 1;
for(let i = 0;i < S.length;i++) {
if(S[i] == S[i + 1]) { count ++; }
else if(count >= 3) { result.push([i - count + 1, i]); count = 1; }
else { count = 1; }
}
return result;
};
代码解析:
该代码应该还是比较简洁的。首先,我定义了数组result用来存放结果,然后定义了字符的重复次数count并初始化为1(因为字符本身与自己重复)。然后遍历字符串,得到相同字符的重复次数;当遇到非连续相同字符时,判断重复次数,如果在三次及以上,就将起点和终点记录下来,并且重置count;如果重复次数没达到三次,就说明不是较大分组,直接重置count即可。
参考链接:https://leetcode-cn.com/problems/positions-of-large-groups/description/