Z-функция
z[i] — сколько символов суффикса i совпадает с префиксом. Один массив — поиск, повторы, сжатие.
1function zFunction(s: string): number[] {2 const n = s.length3 const z = [0]4 let l = 0, r = 0 // самый правый z-бокс5 6 for (let i = 1; i < n; i++) {7 if (i < r) z[i] = Math.min(r - i, z[i - l]!)8 while (i + z[i]! < n && s[z[i]!] === s[i + z[i]!]) z[i]!9 if (i + z[i]! > r) { l = i; r = i + z[i]! }10 }11 12 return z13}14 15function zSearch(text: string, p: string): number[] {16 const z = zFunction(p + '#' + text)17 return z.map((v, i) => (v === p.length ? i - p.length - 1 : -1))18 .filter((i) => i >= 0)19}Проблема
z[i] — сколько символов суффикса i совпадает с префиксом. Один массив — поиск, повторы, сжатие.
Что вы видите
Строка «pattern#text»: z равна длине образца ровно на его вхождениях.
Как это работает
Z-бокс — самый правый известный отрезок совпадения с префиксом; внутри него значения копируются, вне — считаются. Линейно, без откатов. Сестра π-функции из KMP.
Пошаговый разбор
- 01
Z-бокс
Самое правое совпадение с префиксом.
- 02
Копирование
Внутри бокса z уже известна.
- 03
Поиск
z = |образец| на вхождениях.
Complexity и ограничения
Сложность см. в шапке страницы.
Edge cases
- Пустой вход
Корректная тривиальная обработка.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
Поиск
Альтернатива KMP в строковых задачах.
Сжатие
Анализ периодов и повторов.
Биоинформатика
Поиск повторов в ДНК.
Связанные алгоритмы
«Один массив на все повторы строки»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.