01 Идея
Суть: мы заменяем символы и их комбинации так, чтобы в строке остались только «правильные» подстроки, разделённые пробелами. А потом разбиваем строку методом split() и находим самую длинную часть.
Шаг 1: replace()
Заменяем «правильные» комбинации на маркер (например, *)
Или вставляем пробелы между «неправильными» парами
Шаг 2: split() + max()
Разбиваем строку по пробелам
Находим самую длинную часть: max(s.split(), key=len)
💡 Когда использовать? Когда задачу трудно решить однопроходным алгоритмом, но легко свести к замене подстрок. Особенно хорошо работает для задач с парами символов (AB, «согласная + гласная» и т.д.)
02 Пример 1: цепочка из пар AB
Найти самую длинную подстроку, состоящую только из пар AB. Например, в строке XABABCABABABY это ABABAB (длина 6).
# Шаг 1: заменяем пары AB на звёздочку
s = s.replace("AB", "*")
# Шаг 2: заменяем всё что не * на пробел
for c in s:
if c != '*':
s = s.replace(c, " ")
# Шаг 3: split и max
print(len(max(s.split(), key=len)))
Попробуй · пошаговая замена
Нажми «Шаг» или «Запустить»
03 Пример 2: согласная + гласная
Буквы A, B, C, D, E, F. Гласные: A, E. Согласные: B, C, D, F. Найти самую длинную цепочку из пар «согласная + гласная».
# Шаг 1: унифицируем символы
for c in "BCDF": s = s.replace(c, "s") # согласные → s
for c in "AE": s = s.replace(c, "g") # гласные → g
# Шаг 2: пара "sg" → звёздочка
s = s.replace("sg", "*")
# Шаг 3: всё лишнее → пробел, потом split
Попробуй · согласная + гласная
Нажми «Шаг» или «Запустить»
04 Пример 3: нет двух соседних P
Найти самую длинную подстроку, в которой нет двух соседних букв P. Вместо маркеров вставляем пробелы — они «разрезают» строку на части.
# Вставляем пробел между каждой парой PP
s = s.replace("PP", "P P")
s = s.replace("PP", "P P") # дважды!
# Теперь split и max
sMax = max(s.split(), key=len)
print(len(sMax))
⚠️ Почему дважды? Потому что после первой замены остаются неразбитые пары. Например: PPPPP → P PP PP — осталась пара! Второй вызов: P PP PP → P P P P P ✓
Попробуй · разрезание PP
Нажми «Шаг» или «Запустить»
Шпаргалка
| Приём |
Описание |
replace("AB","*") |
Заменяем «правильную» пару на маркер |
| Унификация символов |
Согласные → s, гласные → g, потом replace("sg","*") |
replace("PP","P P") |
Разрезаем строку пробелами в «плохих» местах |
| Двойной replace |
Вызываем дважды, чтобы разбить тройки и более: PPP → P P P |
max(s.split(), key=len) |
Самая длинная часть после разбиения по пробелам |
key=len |
Сравниваем строки по длине, а не по алфавиту |