Левый символ можно убрать без потери покрытия, если он не нужен алфавиту либо его число в окне больше требуемого. Если это последняя необходимая копия, после удаления окно станет неполным.
Как понять, можно ли выбросить конкретный символ (например, символ A) при сужении окна слева, не потеряв покрытие алфавита?
Левый символ можно убрать без потери покрытия, если он не нужен алфавиту либо его число в окне больше требуемого. Если это последняя необходимая копия, после удаления окно станет неполным.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Левый символ можно убрать без потери покрытия, если он не нужен алфавиту либо его число в окне больше требуемого. Если это последняя необходимая копия, после удаления окно станет неполным.
Храните have[c] для текущего окна и need[c] для требуемого покрытия. Перед сдвигом левой границы сравните эти значения: при have[c] > need[c] есть запас. Для алфавита без повторов требование обычно равно единице; для задачи с кратностями оно может быть больше. После удаления уменьшайте счётчик и при нехватке обновляйте признак валидности. Сам факт присутствия A где-то в исходной строке недостаточен — важна его частота внутри текущего окна.