Учитывая строку (допустим только английские символы) S
длины n
, мы можем подсчитать количество палиндромных подстрок с помощью следующего алгоритма:
for i = 0 to |S| do
p1 = number of palindromes centered in i (odd length)
p2 = number of palindromes centered in i and i+1 (even length)
add p1 + p2 to total number of palindromic substrings of S
Код выше O(n^2)
.
Меня интересует алгоритм, который решает эту проблему в O(n)
. Я точно знаю, что он существует, поскольку я слышал, что многие люди говорят, что это так, и проблема существует на местном сайте онлайн-судейства с верхней границей 1 000 000
на n
, однако я никогда не видел алгоритм и не может быть в состоянии придумать это.
Обновление:
Основная идея, которую я имею, состоит в том, чтобы вычислить len[i] = length of the longest palindrome centered at the character 2i + 1
и аналогичный массив для палиндромов четной длины. При хорошем ведении бухгалтерии должно быть возможно вычислить это в O(1)
для каждого символа, что позволит нам подсчитать много палиндромов одновременно. Однако я застрял на том, как именно это вычислить.
Я приму решение, которое использует O(n)
и, возможно, даже O(n log n)
дополнительную память. Я думаю, что это невозможно без этого.
Любые хорошие идеи или ссылки приветствуются.