给定一个长度为 n
的字符串 S
(仅包含英文字符),我们可以使用以下算法计算回文子串的数量:
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)
内解决该问题的算法很感兴趣。我确定存在这样的算法,因为我听到过多个人说它存在,并且该问题存在于一个本地在线评测网站上,n
的上限为1,000,000
,但我从未见过该算法,也无法想出来。更新:
我的大致想法是计算
len[i] = 以字符 2i + 1 为中心的最长回文子串长度
,以及偶数长度的回文子串类似的数组。通过良好的记录,应该可以每个字符都在O(1)
时间内完成计算,这将使我们能够一次性计算出许多回文子串。然而,我卡在如何确切地计算这个数组上。我将接受使用
O(n)
甚至O(n log n)
额外内存的解决方案。我认为如果没有额外内存,这是不可能的。如果有任何好的思路或参考资料,我将不胜感激。