Шаблон — мин. окно со всеми цифрами, без A–F
s = open('24.txt').read()
need = set('0123456789')
forbid = set('ABCDEF')
cnt = {c: 0 for c in need}
have = 0; L = 0; best = 10**9
for R in range(len(s)):
if s[R] in forbid: # запрещённый символ — окно заново
cnt = {c: 0 for c in need}
have = 0; L = R + 1
continue
if s[R] in need:
if cnt[s[R]] == 0:
have += 1
cnt[s[R]] += 1
while have == len(need): # все цифры есть — сужаем слева
if R - L + 1 < best:
best = R - L + 1
if s[L] in need:
cnt[s[L]] -= 1
if cnt[s[L]] == 0:
have -= 1
L += 1
print(best)
Короткий вариант для минимума
s = open('24.txt').read()
last = {} # последняя позиция каждой цифры
best = 10**9
for R in range(len(s)):
if s[R] in 'ABCDEF':
last = {} # сброс сегмента
continue
if s[R].isdigit():
last[s[R]] = R
if len(last) == 10: # встречались все 10 цифр
best = min(best, R - min(last.values()) + 1)
print(best)
Тренировка
Задача 6 — все буквы A–N, без цифр
Максимальное количество идущих подряд символов, среди которых есть все буквы от A до N и нет ни одной цифры.
Решить задачу
Показать подходСкрыть подход
Окно со словарём-счётчиком по буквам A–N, цифра сбрасывает окно. Версия на максимум: расширяем, фиксируем при have == 14.
Задача 7 — все цифры + ровно 3 буквы A–F
Минимальное количество идущих подряд символов, среди которых есть все цифры и ровно три буквы от A до F (других букв сколько угодно).
Решить задачу
Показать подходСкрыть подход
Два инварианта одновременно: have == 10 (все цифры) И cntAF == 3. Самая сложная задача блока — полнота множества плюс точный счёт.
Задача 8 — предложение со всеми буквами
Минимальная длина предложения, содержащего все латинские буквы.
Решить задачу
Показать подходСкрыть подход
Комбинация паттернов 03 + 07: split('.') → для каждого предложения проверка set(sent) >= set(alphabet) → минимум длины.