Leetcode 830. 较大分组的位置(Java实现 超详细注释!)

Leetcode 830. 较大分组的位置

逻辑模拟题,主要是要想到通过分组结束状态去反推分组开始时的状态!加了详细的注释,方便日后复习,也希望能帮到其他小伙伴,如有错误,欢迎指正!

Java实现:

class Solution {
    public List<List<Integer>> largeGroupPositions(String s) {
        // 初始化一个返回结果的列表
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        // 将String转成数组,方便遍历
        char[] array = s.toCharArray();
        // 记录一个字符重复的次数,因为两个字符相等,重复次数就是2,我们相等一次+1,初始应该是1
        int n = 1;
        // 遍历每个字符
        for (int i = 0; i < array.length; i++){
            /**
            当重复结束时,我们可能需要保存此时的较大分组,而我们可以在每次分组结束时判断分组是不是较大分组;
            有两种情况:一 已经遍历到最后一个字符了,那么此时分组一定是结束了,我们需要判断
            二 当前字符和下一个字符不等时,那么这一轮分组到此就结束了
            */
            if (i == array.length - 1 || array[i] != array[i + 1]){
                // 如果分组结束时,字符的重复次数大于或等于3,该分组为较大分组,我们保留
                if (n >= 3){
                    res.add(Arrays.asList(i - n + 1,i));
                }
                // 注意这里只要一个分组结束,那么要开始下一个新的分组时,我们都需要将n重置为1
                n = 1;
            }else{
                // 这种情况是分组未结束,我们给重复次数+1即可
                n ++;
            }
        }
        return res;
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值