Подтема 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)Цикл начинается с i = 1: у первого символа соседа слева нет. Если начать с нуля, s[i - 1] при i = 0 — это s[-1], последний символ строки, и первый символ сравнится с последним.
Соседи различны
А если каждые два соседних символа должны быть разными?
Тот же цикл, только проверка обратная: s[i] != s[i - 1]. Два одинаковых символа рядом обрывают цепочку, второй из них начинает новую. Подходит, например, ABACA: буква A повторяется, но не рядом.
Пройди по шагам строку ABBACAB: пара BB обрывает цепочку AB, и вторая B начинает цепочку BACAB.
- До цикла: первый символ 'A' — цепочка длины 1, current = 1, best = 1. Цикл начинается с i = 1.
- s[1] = 'B': 'B' отличается от предыдущего 'A': цепочка продолжилась. current = 2, best = 2 — новый лучший результат.
- s[2] = 'B': 'B' равен предыдущему 'B', но сам начинает новую цепочку: сброс до 1. current = 1, best = 2.
- s[3] = 'A': 'A' отличается от предыдущего 'B': цепочка продолжилась. current = 2, best = 2.
- s[4] = 'C': 'C' отличается от предыдущего 'A': цепочка продолжилась. current = 3, best = 3 — новый лучший результат.
- s[5] = 'A': 'A' отличается от предыдущего 'C': цепочка продолжилась. current = 4, best = 4 — новый лучший результат.
- 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)Обнулить длину на 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)Тройки 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] — последний символ
Проверьте себя
Ответь сначала сам, потом открой ответ.
ZZYYYZYYYYZ.ОтветСкрыть ответ
current становится 1, а не 0?ОтветСкрыть ответ
print(s[i - 1]) при i = 0 для s = 'KLMN'?ОтветСкрыть ответ
s[-1] — последний символ. Поэтому цикл по соседям начинают с i = 1.KLAKKLB найди самый длинный фрагмент, где буквы K и L не стоят рядом (KK можно).ОтветСкрыть ответ
ОтветСкрыть ответ
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Одинаковые символы подряд
В строке ZZYYYZYYYYZ найди самую длинную цепочку одинаковых символов.
Введите число.
Подсказка
Цепочка продолжается, если символ равен предыдущему.
Решение
4: цепочка YYYY.
Решение программой
s = 'ZZYYYZYYYYZ'current = best = 0for i in range(len(s)): if i > 0 and s[i] == s[i - 1]: current += 1 else: current = 1 best = max(best, current)print(best)Ответ: 4
Одинаковые подряд в файле
Текстовый файл 24-1.txt состоит не более чем из 10⁶ символов X, Y и Z. Определите максимальное количество идущих подряд одинаковых символов.
Введите число.
Подсказка
Сравнивай символ с предыдущим: совпал — цепочка растёт, нет — сброс до 1.
Решение
11.
Решение программой
s = open('24-1.txt').readline().strip()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)Ответ: 11
Различные соседи
В строке CAABCBCC найди самый длинный фрагмент, в котором соседние символы различны.
Введите число.
Подсказка
При одинаковой паре второй символ начинает новую цепочку длины 1.
Решение
5: фрагмент ABCBC; пары AA и CC разрывают цепочку, но второй символ пары начинает новую.
Решение программой
s = 'CAABCBCC'current = best = 0for i in range(len(s)): if i > 0 and s[i] != s[i - 1]: current += 1 else: current = 1 best = max(best, current)print(best)Ответ: 5
Соседи различны в файле
Текстовый файл 24-1.txt состоит не более чем из 10⁶ символов X, Y и Z. Определите максимальное количество идущих подряд символов, среди которых каждые два соседних различны.
Введите число.
Подсказка
Два одинаковых символа рядом обрывают цепочку, второй начинает новую.
Решение
58.
Решение программой
s = open('24-1.txt').readline().strip()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)Ответ: 58
K и L не рядом
В строке KLAKKLB найди самый длинный фрагмент, в котором буквы K и L не стоят рядом (запрещены пары KL и LK, пара KK разрешена).
Введите число.
Подсказка
Запрещённая пара — KL или LK; на втором символе пары сброс до 1.
Решение
4: фрагмент LAKK; на L после K сброс до 1, а не до 0.
Решение программой
s = 'KLAKKLB'current = best = 0for i in range(len(s)): if i > 0 and s[i - 1:i + 1] in ('KL', 'LK'): current = 1 else: current += 1 best = max(best, current)print(best)Ответ: 4
X и Z не рядом
Для файла 24-1.txt определите максимальное количество идущих подряд символов, среди которых никакие две буквы из набора X, Z (с учётом повторений) не стоят рядом.
Введите число.
Подсказка
Пара запрещена, если оба символа из набора XZ — в том числе XX и ZZ.
Решение
31: при паре из набора сброс до 1 — второй символ пары сам начинает новый фрагмент.
Решение программой
s = open('24-1.txt').readline().strip() current = best = 0for i in range(len(s)): if i > 0 and s[i - 1] in 'XZ' and s[i] in 'XZ': current = 1 else: current += 1 best = max(best, current)print(best)Ответ: 31
Без XX и ZZ
Текстовый файл 24-1.txt состоит не более чем из 10⁶ символов X, Y и Z. Найдите длину самой длинной цепочки символов, не содержащей подряд двух X или двух Z.
Введите число.
Подсказка
Запретные пары — XX и ZZ; пара YY разрешена. Сброс до 1.
Решение
67.
Решение программой
s = open('24-1.txt').readline().strip()current = 1best = 1for i in range(1, len(s)): if s[i - 1] + s[i] not in ('XX', 'ZZ'): current += 1 else: current = 1 best = max(best, current) print(best)Ответ: 67
Тройки цифр
В 12456 найди максимальный фрагмент, в котором в каждой соседней тройке сумма первых двух цифр больше третьей. Фрагменты короче трёх символов разрешены.
Введите число.
Подсказка
При плохой тройке остаются две последние цифры: сброс до 2.
Решение
4: фрагмент 2456; тройка 124 не подходит, после неё остаётся 24.
Решение программой
s = '12456'current = best = min(len(s), 2)for 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)Ответ: 4
Крайние больше средней
Текстовый файл 24-2.txt состоит из десятичных цифр. Определите максимальное количество идущих подряд цифр, среди которых для каждых трёх идущих подряд цифр сумма крайних цифр больше средней.
Введите число.
Подсказка
Проверяй тройку, которая кончается текущей цифрой; при нарушении сброс до 2.
Решение
43: при плохой тройке сброс до 2 — две последние цифры ещё допустимы.
Решение программой
s = open('24-2.txt').readline().strip() current = best = min(len(s), 2)for i in range(2, len(s)): if int(s[i - 2]) + int(s[i]) > int(s[i - 1]): current += 1 else: current = 2 best = max(best, current)print(best)Ответ: 43