一尘不染

在O(n)中计算回文子串

algorithm

给定一个字符串(仅假设英文字符)S为length 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 000on n,但是我从未见过该算法,而且似乎无法能够提出来。

更新:

我的一般想法是len[i] = length of the longest palindrome centered at the character 2i + 1为偶数回文长度计算一个类似的数组。有了良好的簿记,应该有可能O(1)针对每个字符进行计算,这将使我们能够一次计算出很多回文数。但是,我仍然坚持如何精确地计算这一点。

我将接受使用O(n)甚至可能有O(n log n)额外内存的解决方案。我认为没有它是不可能的。

任何好的想法或参考,表示赞赏。


阅读 216

收藏
2020-07-28

共1个答案

一尘不染

以下站点显示了一种算法,用于计算O(n)时间中最长的回文子串,并且通过在每个可能的中心计算最长的回文子串,然后取最大值来实现。因此,您应该能够轻松地对其进行修改。

http://www.akalin.cx/2007/11/28/finding-the-longest-palindromic-substring-in-
linear-time/

编辑:仔细检查后,第一个链接看起来有些不稳定,所以这里是另一个:

http://zhuhcheng.spaces.live.com/Blog/cns!DE38E96268C49F28!311.entry?wa=wsignin1.0&sa=707413829

2020-07-28