Манахер: палиндромы за O(n)
Все палиндромные радиусы за один проход — зеркала внутри уже найденного.
1function manacher(s: string): number[] {2 // разделяем #a#b#a# — палиндромы любой чётности едины3 const t = '#' + [...s].join('#') + '#'4 const n = t.length5 const p = new Array(n).fill(0) // p[i] — радиус палиндрома в i6 7 let c = 0, r = 0 // центр и край самого правого палиндрома8 for (let i = 0; i < n; i++) {9 if (i < r) p[i] = Math.min(r - i, p[2 * c - i]!) // зеркало10 while (i - p[i] - 1 >= 0 && i + p[i] + 1 < n &&11 t[i - p[i] - 1] === t[i + p[i] + 1]) p[i]!12 if (i + p[i] > r) { c = i; r = i + p[i] }13 }14 15 return p // длина палиндрома в исходной строке = p[i]16}Проблема
Все палиндромные радиусы за один проход — зеркала внутри уже найденного.
Что вы видите
#a#b#a# — чётность унифицирована; p[i] копируется с зеркала, затем растёт.
Как это работает
Внутри правого палиндрома радиус новой позиции ≥ зеркального. Линейность — амортизация: r только растёт. KMP-уровень изящества для палиндромов.
Пошаговый разбор
- 01
Развёртка
# между символами.
- 02
Зеркало
p[i] ≥ p[зеркало].
- 03
Рост
Пока границы равны.
Complexity и ограничения
Сложность см. в шапке страницы.
Edge cases
- Пустой вход
Корректная тривиальная обработка.
- Вырожденный случай
Минимум работы — сразу ответ.
Где встречается в реальности
Биоинформатика
Палиндромные последовательности ДНК.
Т9
Подсказки при вводе.
Сжатие
Поиск повторов-палиндромов.
Связанные алгоритмы
«KMP, но для палиндромов»
Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.
Shorts 9:16
Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.