Algorithm 在O(n)或O(n log n)中查找回文子串的数目?
我知道你可以用manacher算法找到O(n)中最长的回文子串,但是有可能找到O(n)或O(n log n)中回文子串的总数吗?如果是这样的话,你会怎么做呢 把单个字母也算作回文Algorithm 在O(n)或O(n log n)中查找回文子串的数目?,algorithm,palindrome,Algorithm,Palindrome,我知道你可以用manacher算法找到O(n)中最长的回文子串,但是有可能找到O(n)或O(n log n)中回文子串的总数吗?如果是这样的话,你会怎么做呢 把单个字母也算作回文 例如,“xyx”的回文子串的数量是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
例如,“xyx”的回文子串的数量是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.
字符串
S
的子字符串S'
是半径i
iff的最大回文,从中间开始,它在i
字符的两个方向上读取相同的内容,但对于i+1
字符则不相同
字符串中的任何回文必须是具有相同中心的最大回文的子字符串。相反,具有相同中心的最大回文组的每个子串也必须是回文组。我们还可以很容易地计算具有相同中心的子回文的数量:长度k
的回文包含上限(k/2)
鉴于我们可以使用线性时间中的Manacher算法找到所有最大回文,我们为您的问题提供了一个线性时间算法:找到最大回文长度的数组,除以2,取上限,对数组求和
例1:在“xyx”上,最大回文数为
x, xyx, xyxyx, xyx, x
a, b, abba, b, a
Manacher's可以用来计算数组
1, 0, 3, 0, 5, 0, 3, 0, 1
表示以每个字母和字母之间的每个间隙为中心的最大回文长度。无论如何,将map天花(k/2)
应用于条目,我们得到
1, 0, 2, 0, 3, 0, 2, 0, 1
总共是9
例2:“阿巴”。最大回文数为
x, xyx, xyxyx, xyx, x
a, b, abba, b, a
马纳彻可以用来获得阵列
1, 0, 1, 4, 1, 0, 1
而天花板(k/2)
'd阵列是
1, 0, 1, 2, 1, 0, 1
对于6(a,b,b,a,bb,abba)的总和,我想看看这是否可行,因为回文子串的最大数量是O(n^2)。在我看来,最坏的情况不可能比
O(n²)
,因为仅仅增加每个子串的计数器的动作就是O(n²)
给定一个高度回文的输入。当我尽力得到O(n^2)时,对于像“aaaaa…”这样的输入,这将花费太长的时间。@StriplingWarrior-也就是说,你可以在O(n log n)时间内计算数组中的倒数,即使通过向计数器中添加除1以外的值可以得到θ(n^2)倒数。我已经给出了(我认为是)下面是一个线性时间算法,但鉴于我在现场提出了它,如果你们能检查一下,我将不胜感激。它通过了我尝试过的例子,感觉正确,但是眼睛越多越好。哇。。看起来可能有用。你是如何得到一个长度为k的回文有ceil(k/2)子回文的?它只有ceil(k/2)
子回文有相同的中心;我们不关心其他亚类的回文。@user2612743这样想:字符串中的每个回文都有相同的中心,正好有一个最大回文。所以我们可以划分所有回文的集合,根据它们共享一个中心的最大回文。一个分区中的元素数是Ceil(k/2)
,其中k
是该分区中最长回文的长度。明白了。逻辑似乎合理,算法似乎运行良好——我想我会接受的!你是如何计算最大回文数的?