Подготовка к школе
1 класс
2 класс
3 класс
4 класс
5 класс
6 класс
7 класс
8 класс
9 класс
10 класс
11 класс
ОГЭ
ЕГЭ
Для всех
Назад

24. Подсчет символов: #297623

Сообщить о проблеме
Задание #297623
Задание было решено верно
Задание было решено неверно

Текстовый файл содержит только заглавные буквы латинского алфавита ($ABC\ldots Z$). Определите максимальную длину непрерывного фрагмента, который начинается и заканчивается одной и той же буквой из первой половины алфавита (от $A$ до $M$) и не содержит эту букву внутри.

Условие «начинается и заканчивается буквой $c$, а внутри её нет» означает ровно одно: границы фрагмента — это два соседних вхождения буквы $c$. Между ними этой буквы нет по определению соседства. Значит перебирать подстроки не нужно вовсе, достаточно найти максимальный разрыв между соседними вхождениями для каждой из тринадцати букв $A$–$M$.

Делается это одним проходом. Для каждой буквы храним позицию её последнего встреченного вхождения. Встретив букву снова, сразу получаем кандидата длиной $i — last[c] + 1$: плюс один, потому что обе граничные буквы входят в длину. Затем обновляем last[c].

Буквы от $N$ до $Z$ просто игнорируем — они могут стоять внутри фрагмента сколько угодно раз, ограничение на них не распространяется.

s = open('24-23.txt').read().strip()

last = {}          # позиция предыдущего вхождения буквы
best = 0

for i, c in enumerate(s):
    if 'A' <= c <= 'M':
        if c in last:
            best = max(best, i - last[c] + 1)   # +1 — обе границы входят в длину
        last[c] = i

print(best)   # 322

Проверка найденного фрагмента: длина $322$, он начинается и кончается буквой $M$, внутри буква $M$ не встречается ни разу.

Обратите внимание на диапазон $A$–$M$: сравнение 'A' <= c <= 'M' работает потому, что буквы идут подряд в таблице символов. Если такая запись кажется рискованной, можно написать явно c in 'ABCDEFGHIJKLM'.

Показать
Очки опыта 20
Спросить Зави
0 заданий сегодня

Предложить улучшение