Условие
Дана строка. Найдите длину самой длинной серии подряд идущих одинаковых символов.
Пример.
s = "fffggggrrrrrrrrrtttfffff" → 9 (девять подряд 'r')
Решение
Однопроходный счётчик
Идём по строке, ведём текущую длину серии и максимум.
def longest_run(s: str) -> int:
if not s:
return 0
best = cur = 1
for i in range(1, len(s)):
if s[i] == s[i - 1]:
cur += 1
if cur > best:
best = cur
else:
cur = 1
return bestO(n) времени, O(1) памяти.
Через itertools.groupby
from itertools import groupby
def longest_run(s):
return max((sum(1 for _ in g) for _, g in groupby(s)), default=0)Чистая «функциональная» версия. O(n) времени, O(1) дополнительной (после исчерпания итератора).
Подводные камни
- Пустая строка. Не забыть вернуть
0(в варианте безgroupby). - Юникод. Работает корректно: Python сравнивает кодпойнты.
- Регистрозависимость. Условие — символ; обычно регистр учитывается. Если нет — приведите
s.lower()сначала. - Использовать
re.max(len(m.group()) for m in re.finditer(r'(.)\1*', s))— экзотично, но работает.
Эталонный ответ
from itertools import groupby
def longest_run(s):
return max((sum(1 for _ in g) for _, g in groupby(s)), default=0)O(n) времени.