a = "abc", not-empty, unique

Если задача — найти минимальную подстроку s, содержащую все символы a, подходит скользящее окно. Для указанного примера результат aceb, а при отсутствии подходящего окна возвращается пустая строка.

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

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

Если задача — найти минимальную подстроку s, содержащую все символы a, подходит скользящее окно. Для указанного примера результат aceb, а при отсутствии подходящего окна возвращается пустая строка.

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

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

Условие

a = "abc", not-empty, unique

s = "dfagabfkacebf" => "aceb"

s = ""

Ответ

Если задача — найти минимальную подстроку s, содержащую все символы a, подходит скользящее окно. Для указанного примера результат aceb, а при отсутствии подходящего окна возвращается пустая строка.

В примере a непустая и содержит уникальные символы. Расширяем правую границу, пока окно не покрывает a, затем сдвигаем левую и запоминаем лучший результат.

from collections import Counter

def min_window(a, s):
    required = set(a)
    if not required:
        return ''
    counts = Counter()
    left = covered = 0
    start, length = 0, len(s) + 1
    for right, char in enumerate(s):
        if char in required:
            counts[char] += 1
            covered += counts[char] == 1
        while covered == len(required):
            if right - left + 1 < length:
                start, length = left, right - left + 1
            char_left = s[left]
            if char_left in required:
                counts[char_left] -= 1
                covered -= counts[char_left] == 0
            left += 1
    return s[start:start + length] if length <= len(s) else ''

Ожидаемое время O(len(a) + len(s)), память O(len(a)) без возвращаемой строки. Срез создаётся один раз в конце.

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

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

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

Подробнее