在O(n)或O(n log n)中查找回文子串的数量?

时间:2014-01-04 00:20:56

标签: algorithm palindrome

我知道你可以用Manacher的算法找到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 个答案:

答案 0 :(得分:6)

字符串S'的子字符串S是半径为i的最大回文,如果从中间开始,它在i个字符的两个方向上读取相同,但是不适用于i+1个字符。

字符串中的任何回文必须是具有相同中心的最大回文的子串。相反,具有相同中心的最大回文的每个子串也必须是回文。我们也可以很容易地计算具有相同中心的子回文的数量:长度k的回文包含Ceiling(k/2)个回文。

由于我们可以在线性时间内使用Manacher算法找到所有最大回文,我们为您的问题提供线性时间算法:找到最大回文长度数组,除以2,取上限,求数组。

实施例1:在“xyxyx”上,最大回文是

x, xyx, xyxyx, xyx, x

和Manacher可用于计算数组

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

Manacher's可用于获取阵列

1, 0, 1, 4, 1, 0, 1

并且Ceiling(k/2)'d数组是

1, 0, 1, 2, 1, 0, 1

总和为6(a,b,b,a,bb,abba)。