Найти число палиндромных подстрок в 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, авва.)