DEV//UNIT

Манахер: палиндромы за O(n)

Все палиндромные радиусы за один проход — зеркала внутри уже найденного.

время O(n)память O(n)уровень: продвинутый
Что происходит сейчас0/0
Нажмите Play, чтобы запустить сценарий
TypeScript — активная строка подсвечена шагом
1function manacher(s: string): number[] {
2 // разделяем #a#b#a# — палиндромы любой чётности едины
3 const t = '#' + [...s].join('#') + '#'
4 const n = t.length
5 const p = new Array(n).fill(0) // p[i] — радиус палиндрома в i
6
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-уровень изящества для палиндромов.

Пошаговый разбор

  1. 01

    Развёртка

    # между символами.

  2. 02

    Зеркало

    p[i] ≥ p[зеркало].

  3. 03

    Рост

    Пока границы равны.

Complexity и ограничения

time
O(n)
space
O(n)

Сложность см. в шапке страницы.

Edge cases

  • Пустой вход

    Корректная тривиальная обработка.

  • Вырожденный случай

    Минимум работы — сразу ответ.

Где встречается в реальности

Биоинформатика

Палиндромные последовательности ДНК.

Т9

Подсказки при вводе.

Сжатие

Поиск повторов-палиндромов.

Связанные алгоритмы

Shorts

«KMP, но для палиндромов»

Тот же сценарий StepSequence в вертикальной композиции — с safe zones и записью WebM ниже на странице.

Shorts 9:16

Вертикальная композиция строится той же последовательностью шагов, что и страница: safe zones отмечены пунктиром (там живёт UI платформ), биты сценария подсвечиваются по прогрессу. Кнопка записи сохраняет WebM — детерминированная StepSequence даёт воспроизводимый ролик без монтажа.

KMP, но для палиндромов
Нажмите Play
Бит 1/6 · 0–2 с
Hook
script-setup.ru/algorithms/manacher