【发布时间】:2010-09-05 19:31:34
【问题描述】:
给定一个长度为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] = length of the longest palindrome centered at the character 2i + 1 和一个类似的数组,用于偶数长度的回文数。通过良好的簿记,应该可以在O(1) 中为每个字符计算此值,这将允许我们一次计算大量回文。但是,我不知道如何准确计算它。
我会接受使用O(n) 甚至O(n log n) 额外内存的解决方案。我认为没有它是不可能的。
感谢任何好的想法或参考。
【问题讨论】:
-
是什么让您认为解决方案是 O(n) 时间?此外,有一个需要 O(n log n) 空间的 O(n) 时间算法也很奇怪。
-
@Strilanc - 我认为它是 O(n),因为这是某些人提到的复杂性,也是唯一可以在 0.1 秒内运行一百万个字符的复杂性。
-
@IVlad 如果你知道怎么做,你能把代码贴出来吗?
标签: algorithm string optimization count