Leetcode-830-较大分组的位置

Leetcode-830-较大分组的位置

题目描述

  • 在一个由小写字母构成的字符串 s 中,包含由一些连续的相同字符所构成的分组。

  • 例如,在字符串s = "abbxxxxzyy"中,就含有 “a”, “bb”, “xxxx”, “z” 和 “yy” 这样的一些分组。

  • 分组可以用区间 [start, end]表示,其中 startend 分别表示该分组的起始和终止位置的下标。上例中的 "xxxx" 分组用区间表示为 [3,6]

  • 我们称所有包含大于或等于三个连续字符的分组为 较大分组

  • 找到每一个 较大分组 的区间,按起始位置下标递增顺序排序后,返回结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
示例 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"

示例 4:

输入:s = "aba"
输出:[]

提示:

  • 1 <= s.length <= 1000
  • s 仅含小写英文字母

思路:一次遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public List<List<Integer>> largeGroupPositions(String s) {
// 1. 初始化
List<List<Integer>> res = new ArrayList<>(); // 结果集
int n = s.length(); // 字符串长度
int num = 1; // 用于记录分组长度

// 2. 一次遍历该字符串
for(int i = 0;i < n;i++){
// 2.1 如果下一个字符与当前字符不同,或者已经枚举到字符串尾部,就说明当前字符为当前分组的尾部
if(i == n - 1 || s.charAt(i) != s.charAt(i + 1)){
if(num >= 3){ // 如果分组长度达到3
res.add(Arrays.asList(i - num + 1,i)); // 记录结果
}
num = 1; // 重置分组长度
// 2.2 字符重复的情况
}else{
num++; // ++字符分区长度
}
}
// 3. 返回结果集
return res;
}
}

复杂度分析

  • 时间复杂度 : O(n)
  • 空间复杂度 : O(1)
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2019-2022 Zhuuu
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信