Статья Автор: Деникина Н.В., Деникин А.В.

Вопрос 24. Два указателя и скользящее окно. Шаблон 2 — "НЕ МЕНЕЕ K раз", ищем МИНИМУМ

01 Идея шаблона

Найти минимальную подстроку, где символ X встречается не менее K раз.

Шаблон 1 (предыдущий)

Не более K → ищем максимум
while count > k (нарушено)
Обновляем ПОСЛЕ while

Шаблон 2

Не менее K → ищем минимум
while count >= k (выполнено)
Обновляем ВНУТРИ while

💡 Принцип 1. Двигаем right вправо, пока условие НЕ выполнено
2. Когда выполнено (count ≥ K) — обновляем минимум и сужаем
3. Обновляем ответ внутри while, пока условие ещё выполняется

02 Пошаговый разбор

Строка ABXAXXAB, символ X, не менее K=2 раз. Нажимайте «Шаг».

Интерактивный разбор · шаблон 2
 
 
 
 
 
Нажмите «Шаг» или «Авто»
800ms

03 Код

def min_at_least_k(s, k):
    left = 0
    count_x = 0
    min_len = float('inf')

    for right in range(len(s)):
        if s[right] == 'X':
            count_x += 1

        while count_x >= k:         # пока ВЫПОЛНЕНО
            min_len = min(min_len, right - left + 1)  # ВНУТРИ while
            if s[left] == 'X':
                count_x -= 1
            left += 1

    return min_len
⚠️ Ключевое отличие от Шаблона 1 while count >= k — сужаем ПОКА выполнено (не нарушено!).
Обновляем min_len ВНУТРИ while — ловим минимум на каждом сужении.

04 Песочница

Введите свою строку, целевой символ и K.

Песочница · своя задача
Строка
Символ
K (не менее)
 
 
 
 
 
Нажмите «Применить», затем «Шаг»
800ms

💡 Нажмите на строку теста ниже — она подставится автоматически


05 Тесты

Попробуй · тестирование
ABXAXXAB X ≥ 2 Ответ: ?
XAXBXAXBXA X ≥ 3 Ответ: ?
AAXBBXCCX X ≥ 1 Ответ: ?
XXXXX X ≥ 3 Ответ: ?
ABCABC X ≥ 1 Ответ: ?

06 Сравнение шаблонов

  Шаблон 1 Шаблон 2
Условие Не более K Не менее K
Ищем Максимум Минимум
while count > k count >= k
Обновление ПОСЛЕ while ВНУТРИ while
Начальное значение max_len = 0 min_len = ∞
Печать