Код содержит синтаксическую ошибку в if. По замыслу он ищет минимальную подстроку s, содержащую все различные символы a; кратность символов в a через set теряется.
Минимальная подстрока: синтаксис и потеря кратности в set
Код содержит синтаксическую ошибку в if. По замыслу он ищет минимальную подстроку s, содержащую все различные символы a; кратность символов в a через set теряется.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
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 and \
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
Ответ
Код содержит синтаксическую ошибку в if. По замыслу он ищет минимальную подстроку s, содержащую все различные символы a; кратность символов в a через set теряется.
Исправленный вариант именно для множества символов:
from collections import Counter
def min_s(a, s):
need = set(a)
if not need:
return ''
window = Counter()
covered = left = 0
best = None
for right, char in enumerate(s):
if char in need:
window[char] += 1
covered += window[char] == 1
while covered == len(need):
if best is None or right - left < best[1] - best[0]:
best = (left, right)
char = s[left]
if char in need:
window[char] -= 1
covered -= window[char] == 0
left += 1
return '' if best is None else s[best[0]:best[1] + 1]
Границы движутся только вперёд: O(len(a)+len(s)) в среднем, плюс итоговый срез. Для требования учесть повторы в a нужен Counter(a) и сравнение требуемых количеств.