题目详情:
在一个由小写字母构成的字符串 s 中,包含由一些连续的相同字符所构成的分组。
例如,在字符串 s = "abbxxxxzyy" 中,就含有 "a", "bb", "xxxx", "z" 和 "yy" 这样的一些分组。
分组可以用区间 [start, end] 表示,其中 start 和 end 分别表示该分组的起始和终止位置的下标。上例中的 "xxxx" 分组用区间表示为 [3,6] 。
我们称所有包含大于或等于三个连续字符的分组为 较大分组 。
找到每一个 较大分组 的区间,按起始位置下标递增顺序排序后,返回结果。
示例:
输入:s = "abbxxxxzzy"
输出:[[3,6]]
解释:"xxxx" 是一个起始于 3 且终止于 6 的较大分组。
解题思路:
首先,我们定义一个空数组 result 来存储结果。然后,定义一个变量 start 来记录当前分组的起始位置。
使用一个循环遍历字符串 s,从第二个字符开始(索引为1)。如果当前字符与前一个字符不相同,或者已经遍历到了字符串的末尾,则表示当前分组结束。我们检查当前分组的长度是否大于等于3,如果是,则将起始位置和结束位置的下标构成的区间 [start, i-1] 添加到结果数组 result 中。然后,更新 start 的值为当前字符的下标,开始记录新的分组的起始位置。
最后,返回结果数组 result。
代码实现:
function largeGroupPositions(s) {
const result = [];
let start = 0;
for (let i = 1; i <= s.length; i++) {
if (i === s.length || s[i] !== s[i - 1]) {
if (i - start >= 3) {
result.push([start, i - 1]);
}
start = i;
}
}
return result;
}
// 示例输入
const s = "abbxxxxzzy";
// 调用函数并输出结果
console.log(largeGroupPositions(s));