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