Как узнать
непрерывный подмассив или подстрока, самый длинный или самый короткий с условием.
Как решать такие задачи
- Сформулируй правило хорошего окна: без повторов, сумма не больше k, не больше k разных букв.
- Реши, что хранить об окне, чтобы правило проверялось быстро: множество, словарь счётчиков, текущую сумму.
- Расширяй окно справа. Пока оно нарушает правило, сужай его слева.
- Обновляй ответ, пока окно хорошее: для самого длинного после сужения, для самого короткого во время сужения.
Вариант: Фиксированный размер
То же, но размер окна не меняется: на каждом шаге один элемент входит и один выходит. Ответ для окна не считаем заново, а поправляем от предыдущего.
- Убедись, что длина окна фиксирована: k чисел подряд, подстрока длиной с образец.
- Реши, что хранить об окне, чтобы один вошедший или ушедший элемент обновлял это за O(1): текущую сумму, словарь счётчиков букв.
- Собери первое окно из первых k элементов и запиши для него ответ.
- Сдвигай: добавь элемент на right, убери элемент на right - k и обнови ответ. Так же считаются средние и окна-анаграммы со счётчиками букв.
Где встречается
- TCP. Отправитель шлёт несколько пакетов, не дожидаясь ответа, но не больше, чем позволяет окно. Когда приходит подтверждение, окно сдвигается вперёд и можно слать следующие.
- gzip и zip. Их сжатие, DEFLATE, ищет повторы в последних 32 КБ текста. Окно едет вместе с текстом, а найденный повтор заменяется короткой ссылкой назад.
- Ограничение запросов. Правило «не больше 100 запросов за последнюю минуту» — это окно в одну минуту, которое едет вместе со временем. Так считает лимиты Cloudflare.