题目描述
在一个由小写字母构成的字符串 s
中,包含由一些连续的相同字符所构成的分组。
例如,在字符串 s = "abbxxxxzyy"
中,就含有 "a"
, "bb"
, "xxxx"
, "z"
和 "yy"
这样的一些分组。
分组可以用区间 [start, end]
表示,其中 start
和 end
分别表示该分组的起始和终止位置的下标。上例中的 "xxxx"
分组用区间表示为 [3,6]
。
我们称所有包含大于或等于三个连续字符的分组为 较大分组 。
找到每一个 较大分组 的区间,按起始位置下标递增顺序排序后,返回结果。
示例 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
仅含小写英文字母
解法
方法一:双指针
我们用双指针 $i$ 和 $j$ 找到每个分组的起始位置和终止位置,然后判断分组长度是否大于等于 $3$,若是则将其加入结果数组。
时间复杂度 $O(n)$,其中 $n$ 为字符串 $s$ 的长度。
1
2
3
4
5
6
7
8
9
10
11
12 | class Solution:
def largeGroupPositions(self, s: str) -> List[List[int]]:
i, n = 0, len(s)
ans = []
while i < n:
j = i
while j < n and s[j] == s[i]:
j += 1
if j - i >= 3:
ans.append([i, j - 1])
i = j
return ans
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | class Solution {
public List<List<Integer>> largeGroupPositions(String s) {
int n = s.length();
int i = 0;
List<List<Integer>> ans = new ArrayList<>();
while (i < n) {
int j = i;
while (j < n && s.charAt(j) == s.charAt(i)) {
++j;
}
if (j - i >= 3) {
ans.add(List.of(i, j - 1));
}
i = j;
}
return ans;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | class Solution {
public:
vector<vector<int>> largeGroupPositions(string s) {
int n = s.size();
int i = 0;
vector<vector<int>> ans;
while (i < n) {
int j = i;
while (j < n && s[j] == s[i]) {
++j;
}
if (j - i >= 3) {
ans.push_back({i, j - 1});
}
i = j;
}
return ans;
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | func largeGroupPositions(s string) [][]int {
i, n := 0, len(s)
ans := [][]int{}
for i < n {
j := i
for j < n && s[j] == s[i] {
j++
}
if j-i >= 3 {
ans = append(ans, []int{i, j - 1})
}
i = j
}
return ans
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 | function largeGroupPositions(s: string): number[][] {
const n = s.length;
const ans: number[][] = [];
for (let i = 0; i < n; ) {
let j = i;
while (j < n && s[j] === s[i]) {
++j;
}
if (j - i >= 3) {
ans.push([i, j - 1]);
}
i = j;
}
return ans;
}
|