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;
    }
}

你可能感兴趣的:(Leetcode,leetcode,字符串)