Longest Substring of One Repeating Character LeetCode solution in Python

1
from sortedcontainers import SortedList
2

3

4
class Solution:
5
def longestRepeating(
6
self, s: str, queryCharacters: str, queryIndices: List[int]
7
) -> List[int]:
8
sl = SortedList()
9
length = SortedList()
10
curr = 0
11
for char, it in itertools.groupby(s):
12
c = sum(1 for _ in it)
13
length.add(c)
14
sl.add((curr, curr + c, char))
15
curr += c
16
ans = []
17
for char, i in zip(queryCharacters, queryIndices):
18
t = (i, math.inf, "a")
19
index = sl.bisect_right(t) - 1
20
to_remove = [sl[index]]
21
to_add = []
22
left, right, original_char = to_remove[0]
23
if original_char != char:
24
length.remove(right - left)
25
if right - left > 1:
26
if i == left:
27
left += 1
28
to_add.append((left, right, original_char))
29
length.add(right - left)
30
elif i == right - 1:
31
right -= 1
32
to_add.append((left, right, original_char))
33
length.add(right - left)
34
else:
35
to_add.append((left, i, original_char))
36
length.add(i - left)
37
to_add.append((i + 1, right, original_char))
38
length.add(right - (i + 1))
39

40
l, r = i, i + 1
41
if index - 1 >= 0 and sl[index - 1][1:3] == (i, char):
42
l, old_r, _ = sl[index - 1]
43
to_remove.append(sl[index - 1])
44
length.remove(old_r - l)
45
if (
46
index + 1 < len(sl)
47
and sl[index + 1][0] == i + 1
48
and sl[index + 1][2] == char
49
):
50
old_l, r, old_length = sl[index + 1]
51
to_remove.append(sl[index + 1])
52
length.remove(r - old_l)
53
length.add(r - l)
54
sl.add((l, r, char))
55
for t in to_remove:
56
sl.remove(t)
57
sl.update(to_add)
58
# print(sl)
59
# print(length)
60
ans.append(length[-1])
61

62
return ans

0

WPM •0 •0

100%

ACC •0 •0

0s

TIME •0