Если задача — найти минимальную подстроку s, содержащую все символы a, подходит скользящее окно. Для указанного примера результат aceb, а при отсутствии подходящего окна возвращается пустая строка.
a = "abc", not-empty, unique
Если задача — найти минимальную подстроку 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)) без возвращаемой строки. Срез создаётся один раз в конце.