Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 在O(n)或O(n log n)中查找回文子串的数目?_Algorithm_Palindrome - Fatal编程技术网

Algorithm 在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

我知道你可以用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 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
是该分区中最长回文的长度。明白了。逻辑似乎合理,算法似乎运行良好——我想我会接受的!你是如何计算最大回文数的?