较大分组的位置

LeetCode每日一题,830. Position of Large Groups

先看题目描述

skUU4U.png

大意就是给定一个由小写字母组成的字符串 s,包含一些由连续相同字母组成的分组,将所有包含三个或以上相同连续字母的分组称为较大分组,让我按起始位置下标的递增顺序们返回所有的较大分组

算法和思路

这题的思路很简单,我们可以遍历该字符串,并记录当前分组的长度和起始坐标,如果当前字符与上一个字符不相同,那么我们就找到了当前分组的尾部,若该分组的长度达到 3,则将其加到答案中,并接着维护下一个分组的长度和起始坐标。需要注意的是,对于字符串尾部的分组,需要特殊处理

算法源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution {
public List<List<Integer>> largeGroupPositions(String s) {
List<List<Integer>> res = new ArrayList<>();
int len = s.length();
if (len < 3) {
return res;
}
int start = 0;
int cnt = 1;
char[] ss = s.toCharArray();
for (int i = 1; i < len; i++) {
if (ss[i] == ss[i - 1]) {
cnt++;
} else {
if (cnt >= 3) {
res.add(Arrays.asList(start, i - 1));
}
cnt = 1;
start = i;
}
}
if (cnt >= 3) {
res.add(Arrays.asList(start, len - 1));
}
return res;
}
}

这里用 Arrays.asList() 方法初始化 List 的用法值得学习一下,以前没怎么试过这个用法,都是先初始化一个空的 List,然后逐个的添加元素,感觉像这样用 Arrays.asList() 方法可以省事些