830. Positions of Large Groups
leetcode
Task
: easy
В строке s из строчных букв эти буквы образуют последовательные группы одного и того же символа.
Например, строка s = "abbxxxxzyy" имеет группы "a", "bb", "xxxx", "z" и "yy".
Группа идентифицируется интервалом [start, end], где start и end обозначают начальный и конечный индексы (включительно) группы. В приведенном выше примере "xxxx" имеет интервал [3,6].
Группа считается большой, если в ней 3 или более символов.
Верните интервалы каждой большой группы, отсортированные в порядке возрастания начального индекса.
Пример:
Input: s = "abcdddeeeeaabbbcd"
Output: [[3,5],[6,9],[12,14]]
Explanation: The large groups are "ddd", "eeee", and "bbb".
C# solution
matched/originalusing System.Collections.Generic;
public class Solution {
public IList<IList<int>> LargeGroupPositions(string S) {
var ans = new List<IList<int>>();
int i = 0, N = S.Length;
for (int j = 0; j < N; ++j) {
if (j == N - 1 || S[j] != S[j + 1]) {
if (j - i + 1 >= 3) {
ans.Add(new List<int> { i, j });
}
i = j + 1;
}
}
return ans;
}
}C++ solution
auto-draft, review before submit#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public IList<vector<int>> LargeGroupPositions(string S) {
var ans = new List<vector<int>>();
int i = 0, N = S.size();
for (int j = 0; j < N; ++j) {
if (j == N - 1 || S[j] != S[j + 1]) {
if (j - i + 1 >= 3) {
ans.push_back(new List<int> { i, j });
}
i = j + 1;
}
}
return ans;
}
}Java solution
matched/originalclass Solution {
public List<List<Integer>> largeGroupPositions(String S) {
List<List<Integer>> ans = new ArrayList();
int i = 0, N = S.length();
for (int j = 0; j < N; ++j) {
if (j == N-1 || S.charAt(j) != S.charAt(j+1)) {
if (j-i+1 >= 3)
ans.add(Arrays.asList(new Integer[]{i, j}));
i = j + 1;
}
}
return ans;
}Python solution
matched/originalclass Solution:
def largeGroupPositions(self, S: str):
ans = []
i, N = 0, len(S)
for j in range(N):
if j == N - 1 or S[j] != S[j + 1]:
if j - i + 1 >= 3:
ans.append([i, j])
i = j + 1Go solution
matched/originalfunc largeGroupPositions(S string) [][]int {
var ans [][]int
i, N := 0, len(S)
for j := 0; j < N; j++ {
if j == N-1 || S[j] != S[j+1] {
if j-i+1 >= 3 {
ans = append(ans, []int{i, j})
}
i = j + 1
}
}
return ans
}Explanation
Algorithm
Поддерживайте указатели i и j, где i <= j. Указатель i представляет начало текущей группы, а j будет инкрементироваться вперед, пока не достигнет конца группы.
Когда j достигнет конца строки или S[j] != S[j+1], у нас будет группа [i, j]. Если длина группы больше или равна 3, добавьте её в результат.
Обновите i = j + 1 и начните новую группу.
😎