Код ищет минимальную подстроку s со всеми различными символами a. Повторы в a не учитываются. Нужно обработать пустое a и сохранять индексы, а не многократно копировать найденные подстроки.
from collections import Counter
Код ищет минимальную подстроку s со всеми различными символами a. Повторы в a не учитываются. Нужно обработать пустое a и сохранять индексы, а не многократно копировать найденные подстроки.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
from collections import Counter
def min_s(a: str, s: str) -> str: need = set(a) window = Counter() res = "" c = 0
left = 0
best_len = float('inf')
for right, char in enumerate(s):
if char in need:
window[char] += 1
if window[char] == 1:
c += 1
while c == len(need):
if right - left + 1 < best_len:
res = s[left:right + 1]
best_len = right - left + 1
if s[left] in need:
window[s[left]] -= 1
if window[s[left]] == 0:
c -= 1
left += 1
return res
Ответ
Код ищет минимальную подстроку s со всеми различными символами a. Повторы в a не учитываются. Нужно обработать пустое a и сохранять индексы, а не многократно копировать найденные подстроки.
Исправленный вариант с той же семантикой множества:
from collections import Counter
def min_s(a, s):
need = set(a)
if not need:
return ''
counts = Counter()
found = left = 0
best_start, best_len = 0, len(s) + 1
for right, char in enumerate(s):
if char in need:
counts[char] += 1
found += counts[char] == 1
while found == len(need):
length = right - left + 1
if length < best_len:
best_start, best_len = left, length
old = s[left]
if old in need:
counts[old] -= 1
found -= counts[old] == 0
left += 1
return s[best_start:best_start + best_len] if best_len <= len(s) else ''
Каждый указатель движется только вперёд: ожидаемое время O(len(a) + len(s)), дополнительная память O(len(set(a))) без результата. Для учёта кратности символов нужен Counter(a) и другие условия заполнения окна.