较大分组的位置

127 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

题目描述

在一个由小写字母构成的字符串 s 中,包含由一些连续的相同字符所构成的分组。 例如,在字符串 s = "abbxxxxzyy" 中,就含有 "a", "bb", "xxxx", "z" 和 "yy" 这样的一些分组。 分组可以用区间 [start, end] 表示,其中 start 和 end 分别表示该分组的起始和终止位置的下标。上例中的 "xxxx" 分组用区间表示为 [3,6] 。 我们称所有包含大于或等于三个连续字符的分组为 较大分组 。 找到每一个 较大分组 的区间,按起始位置下标递增顺序排序后,返回结果。(出自力扣)

  • 示例1:
输入: s = "abbxxxxzzy"
输出: [[3,6]]
解释 : "xxxx" 是一个起始于 3 且终止于 6 的较大分组。
  • 示例2:
输入: s = "abc"
输出: []
解释: "a","b""c" 均不是符合要求的较大分组。
  • 示例3:
输入:s = "abcdddeeeeaabbbcd"
输出:[[3,5],[6,9],[12,14]]
解释:较大分组为 "ddd", "eeee""bbb"

思路分析

我们可以先循环遍历一下字符串,并把当前分组的长度记录下来,每次遍历的时候进行判断,如果当前的字符串和下一个字符串不相同,或者已经循环到该字符串的结尾了,那么就说明已经到该分组的结尾,如果不是,则继续循环遍历,并且当前分组的长度加1;如果找到该分组的结尾时,再判断长度是否大于等于3,若满足,那么就将其加入答案,若不满足,则将num重置为1

AC代码

getGroup(str){
    let res = [];
    let num = 1;
    for(let i=0; i<str.length; i++) {
        if (str[i] !== str[i + 1] || i === n - 1) {
            if (num >= 3) {
                res.push([i - num + 1, i]);
            }
            num = 1;
        } else {
            num++;
        }
    }
    console.log(res);
}

总结

这道题主要是判断当前字符串和一个字符串的区别,以及判断分组的长度是否大于3,只要确定好这两个条件就可以了。