Минимальное окно: два указателя и непокрытые символы

Минимальное окно ищется двумя указателями и счётчиком непокрытых символов. Когда окно содержит весь a, левую границу сдвигают до потери полноты.

Короткий ответ

Что ответить на собеседовании

Минимальное окно ищется двумя указателями и счётчиком непокрытых символов. Когда окно содержит весь a, левую границу сдвигают до потери полноты.

Подробный разбор

Ответ с пояснениями

Условие

# a = "abc", not-empty, unique (m)
# s = "dfaga[bfkac]ebf" => "aceb" (n) O(n)
# s = "cfaafb" => "cfaafb"
# s = "affb" => ""

from collections import Counter

def min_s(a: str, s: str) -> str:
    need = Counter(a)

Ответ

Минимальное окно ищется двумя указателями и счётчиком непокрытых символов. Когда окно содержит весь a, левую границу сдвигают до потери полноты.

Скобки вокруг фрагмента примера считаем разметкой, не символами строки. Для dfagabfkacebf минимальный ответ — aceb, а не отмеченный более длинный участок.

from collections import Counter

def min_s(a: str, s: str) -> str:
    if not a:
        return ''
    need, missing = Counter(a), len(a)
    left, best = 0, None
    for right, ch in enumerate(s):
        missing -= need[ch] > 0
        need[ch] -= 1
        while missing == 0:
            if best is None or right + 1 - left < best[1] - best[0]:
                best = (left, right + 1)
            need[s[left]] += 1
            missing += need[s[left]] > 0
            left += 1
    return '' if best is None else s[best[0]:best[1]]

Ожидаемое время O(m+n), память по числу разных символов. Реализация также учитывает повторения в a, хотя условие гарантирует уникальность.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее