К содержанию

Подтема 2 из 7

Условия на соседей

Одинаковые подряд, соседи различны, запретные пары, тройки: после нарушения цепочка начинается заново с 1 или 2 символов.

Одинаковые подряд

Как найти самую длинную цепочку одинаковых символов, если буква заранее не известна?

Сравнивать каждый символ с предыдущим. Совпал — цепочка растёт. Не совпал — новая цепочка начинается с этого символа: current = 1, а не 0. Условие здесь на пару соседей, а один символ сам по себе ему не мешает.

s = 'AABBBBCCAAA'current = 1best = 1for i in range(1, len(s)):    if s[i] == s[i - 1]:        current += 1    else:        current = 1    best = max(best, current) print(best)
4

Цикл начинается с i = 1: у первого символа соседа слева нет. Если начать с нуля, s[i - 1] при i = 0 — это s[-1], последний символ строки, и первый символ сравнится с последним.

Соседи различны

А если каждые два соседних символа должны быть разными?

Тот же цикл, только проверка обратная: s[i] != s[i - 1]. Два одинаковых символа рядом обрывают цепочку, второй из них начинает новую. Подходит, например, ABACA: буква A повторяется, но не рядом.

Пройди по шагам строку ABBACAB: пара BB обрывает цепочку AB, и вторая B начинает цепочку BACAB.

  1. До цикла: первый символ 'A' — цепочка длины 1, current = 1, best = 1. Цикл начинается с i = 1.
  2. s[1] = 'B': 'B' отличается от предыдущего 'A': цепочка продолжилась. current = 2, best = 2 — новый лучший результат.
  3. s[2] = 'B': 'B' равен предыдущему 'B', но сам начинает новую цепочку: сброс до 1. current = 1, best = 2.
  4. s[3] = 'A': 'A' отличается от предыдущего 'B': цепочка продолжилась. current = 2, best = 2.
  5. s[4] = 'C': 'C' отличается от предыдущего 'A': цепочка продолжилась. current = 3, best = 3 — новый лучший результат.
  6. s[5] = 'A': 'A' отличается от предыдущего 'C': цепочка продолжилась. current = 4, best = 4 — новый лучший результат.
  7. s[6] = 'B': 'B' отличается от предыдущего 'A': цепочка продолжилась. current = 5, best = 5 — новый лучший результат.

Ответ — 5. Не путай с условием «все символы фрагмента различны»: в ABACA соседи различны, а все символы — нет. Это другая задача, она решается окном.

Запретные пары

Условие запрещает некоторые пары рядом: «никакие две буквы из A, B, C не стоят подряд». Как это проверить?

Так же, как соседей: меняется только проверка пары. Запретная пара обрывает цепочку, а её второй символ начинает новую. Выбери условие из подборок, чтобы увидеть проверку:

две из A, B, C
s[i - 1] in 'ABC' and s[i] in 'ABC'пара плохая — сброс до 1
I не рядом с T
s[i - 1] + s[i] in ('IT', 'TI')обе пары, IT и TI
нет XX и YY
s[i - 1] + s[i] in ('XX', 'YY')XY, YX и ZZ разрешены
по алфавиту
s[i - 1] > s[i]буквы сравниваются по алфавиту, как строки

Посмотрим на условие про A, B, C в строке DXABYCZ. Пара AB запретна: цепочка DXA обрывается, B начинает новую — BYCZ:

s = 'DXABYCZ'current = 1best = 1for i in range(1, len(s)):    if s[i - 1] in 'ABC' and s[i] in 'ABC':        current = 1    else:        current += 1    best = max(best, current) print(best)
4

Обнулить длину на B было бы ошибкой: сама B не запрещена, запрещена только пара. Ответ — 4, фрагмент BYCZ.

Тройки: сброс до 2

Условие задано для каждых трёх соседних цифр: «сумма первых двух больше третьей». До скольких символов сбрасывать цепочку?

До двух: после плохой тройки две её последние цифры ещё не образуют ни одной тройки, поэтому фрагмент из них допустим. Общее правило: после нарушения оставляем самый длинный конец цепочки, который ещё подходит.

s = '2451246'current = 2best = 2for i in range(2, len(s)):    if int(s[i - 2]) + int(s[i - 1]) > int(s[i]):        current += 1    else:        current = 2    best = max(best, current) print(best)
5

Тройки 245, 451 и 512 подходят — цепочка 24512 длины 5. Тройка 124 плохая: 1 + 2 не больше 4, и с цифр 24 начинается новая цепочка.

Условие наСброс доЧто остаётся
один символ0ничего: плохой символ не входит ни в какую цепочку
пару соседей1второй символ плохой пары
тройку соседей2два последних символа плохой тройки

Итого

  • Одинаковые подрядs[i] == s[i - 1]
  • Соседи различныs[i] != s[i - 1]
  • Запретная парасброс до 1: второй символ начинает новую цепочку
  • Тройкисброс до 2
  • Начало циклас i = 1 (для троек — с 2): s[-1] — последний символ

Проверьте себя

Ответь сначала сам, потом открой ответ.

Вопрос 1
Найди самую длинную цепочку одинаковых символов в ZZYYYZYYYYZ.
ОтветСкрыть ответ
Ответ
4: YYYY ближе к концу строки.
Вопрос 2
Почему при разрыве цепочки одинаковых символов current становится 1, а не 0?
ОтветСкрыть ответ
Ответ
Символ, на котором цепочка оборвалась, сам начинает новую цепочку длины 1: условие связывает пару, а один символ ему не мешает.
Вопрос 3
Что напечатает print(s[i - 1]) при i = 0 для s = 'KLMN'?
ОтветСкрыть ответ
Ответ
N: s[-1] — последний символ. Поэтому цикл по соседям начинают с i = 1.
Вопрос 4
В строке KLAKKLB найди самый длинный фрагмент, где буквы K и L не стоят рядом (KK можно).
ОтветСкрыть ответ
Ответ
4: LAKK. Пары KL на позициях 0–1 и 4–5 обрывают цепочку, но L после разрыва начинает новую.
Вопрос 5
Условие задано для каждых трёх соседних цифр. До скольких символов сбрасывается цепочка на плохой тройке и почему?
ОтветСкрыть ответ
Ответ
До 2: две последние цифры плохой тройки ещё не образуют ни одной тройки, поэтому фрагмент из них допустим.

Практика

Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.

Одинаковые символы подряд

В строке ZZYYYZYYYYZ найди самую длинную цепочку одинаковых символов.

Введите число.

Одинаковые подряд в файле

Текстовый файл 24-1.txt состоит не более чем из 10⁶ символов X, Y и Z. Определите максимальное количество идущих подряд одинаковых символов.

24-1.txtСтрока из символов X, Y и ZТекстовый файл · 195,3 КБ

Введите число.

Различные соседи

В строке CAABCBCC найди самый длинный фрагмент, в котором соседние символы различны.

Введите число.

Соседи различны в файле

Текстовый файл 24-1.txt состоит не более чем из 10⁶ символов X, Y и Z. Определите максимальное количество идущих подряд символов, среди которых каждые два соседних различны.

24-1.txtСтрока из символов X, Y и ZТекстовый файл · 195,3 КБ

Введите число.

K и L не рядом

В строке KLAKKLB найди самый длинный фрагмент, в котором буквы K и L не стоят рядом (запрещены пары KL и LK, пара KK разрешена).

Введите число.

X и Z не рядом

Для файла 24-1.txt определите максимальное количество идущих подряд символов, среди которых никакие две буквы из набора X, Z (с учётом повторений) не стоят рядом.

24-1.txtСтрока из символов X, Y и ZТекстовый файл · 195,3 КБ

Введите число.

Текстовый файл 24-1.txt состоит не более чем из 10⁶ символов X, Y и Z. Найдите длину самой длинной цепочки символов, не содержащей подряд двух X или двух Z.

24-1.txtСтрока из символов X, Y и ZТекстовый файл · 195,3 КБ

Введите число.

Тройки цифр

В 12456 найди максимальный фрагмент, в котором в каждой соседней тройке сумма первых двух цифр больше третьей. Фрагменты короче трёх символов разрешены.

Введите число.

Крайние больше средней

Текстовый файл 24-2.txt состоит из десятичных цифр. Определите максимальное количество идущих подряд цифр, среди которых для каждых трёх идущих подряд цифр сумма крайних цифр больше средней.

24-2.txtСтрока из десятичных цифрТекстовый файл · 195,3 КБ

Введите число.