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

Код содержит синтаксическую ошибку в if. По замыслу он ищет минимальную подстроку s, содержащую все различные символы a; кратность символов в a через 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) и сравнение требуемых количеств.

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

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

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

Подробнее