Найти число палиндромных подстрок в O(n) или O (N log n)?

Я знаю, вы можете найти самую длинную подстроку-палиндром в o(n) с алгоритм манакера, но это можно найти в общей сумме палиндромных подстрок в O(n) или O (N log n)? Если да, то как бы вы это сделали?

считать одиночные буквы как палиндромы тоже.


Так, например, число-палиндром подстроки "xyxyx" составляет 9.

Это потому, что у вас есть:

5 single letter palindromes (x,y,x,y,x)
3 palindromes with three letters (xyx, yxy, xyx)
1 palindrome with five letters (xyxyx)

for a total of 5+3+1 = 9 palindromic substrings.

1 ответов


подстроку S' строки S максимальный палиндром радиуса i iff, начиная с середины, он читает одинаково в обоих направлениях для i символов, но не для i+1 символы.

любой палиндром в строке должен быть подстрокой максимального палиндрома с тем же центром. И наоборот, каждая подстрока максимального палиндрома с тем же центром также должна быть палиндромом. Мы также можем легко подсчитать количество суб-палиндромов с помощью тот же центр: палиндром длины k содержит Ceiling(k/2) из них.

видя, что мы можем найти все максимальные палиндромы, используя алгоритм Манахера в линейном времени, у нас есть алгоритм линейного времени для вашей задачи: найти массив длин максимальных палиндромов, разделить на два, взять потолок, суммировать массив.

Пример 1: на" xyxyx " максимальными палиндромами являются

x, xyx, xyxyx, xyx, x

и Манакера могут быть использованы для расчета массив

1, 0, 3, 0, 5, 0, 3, 0, 1

представляющий длины максимальных палиндромов центром в каждой букве и в каждом промежутке между буквами. Во всяком случае, применяя карту Ceiling(k/2) в записи, мы получаем

1, 0, 2, 0, 3, 0, 2, 0, 1

что составляет 9.

Пример 2: "abba". Максимальные палиндромы

a, b, abba, b, a

Манакера могут быть использованы для получения массива

1, 0, 1, 4, 1, 0, 1

и это

1, 0, 1, 2, 1, 0, 1

для суммы 6 (a, b, b, a, bb, авва.)