Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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
C++ 通过仅在字符串末尾添加字符扩展到最短回文的算法_C++_Algorithm - Fatal编程技术网

C++ 通过仅在字符串末尾添加字符扩展到最短回文的算法

C++ 通过仅在字符串末尾添加字符扩展到最短回文的算法,c++,algorithm,C++,Algorithm,我发现了一个算法问题。我解决了这个问题,但我想优化它。我在这里问同样的问题 问题 给出一个字符串,该字符串的长度为N请注意,在回文中,与字符串中间距离相等的所有字符对都是相等的 这建议采用以下算法: 找到最大的回文后缀,然后在该回文后缀的左侧追加子字符串的反面。这将通过在字符串末尾添加字符获得最短的回文 一个野蛮的实现将是O(n^2)。通过使用两个测试后缀是否是O(1)中的回文,可以得到O(n) 以下是这些哈希的工作原理: hForward(suff) = suff[0] * p^0 + su

我发现了一个算法问题。我解决了这个问题,但我想优化它。我在这里问同样的问题

问题


给出一个字符串,该字符串的长度为N请注意,在回文中,与字符串中间距离相等的所有字符对都是相等的

这建议采用以下算法:

找到最大的回文后缀,然后在该回文后缀的左侧追加子字符串的反面。这将通过在字符串末尾添加字符获得最短的回文

一个野蛮的实现将是
O(n^2)
。通过使用两个测试后缀是否是
O(1)
中的回文,可以得到
O(n)

以下是这些哈希的工作原理:

hForward(suff)  = suff[0] * p^0 + suff[1] * p^1 + ... + suff[k] * p^k
hBackward(suff) = suff[k] * p^0 + suff[k-1] * p^1 + ... + suff[0] * p^k

When adding a new character to the suffix:
Note that this is added to the beginning, since we should iterate the suffixes
from right to left.
hForward(c + suff) = c * p^0 + p * hForward(suff)
hBackward(c + suff) = hBackward(suff) + c * p^(k + 1)  
其中
p
应该是一个(小的)素数,你应该用另一个(大的)素数进行所有的计算。为了保持它的效率,递增地计算幂,不要使用任何求幂算法。您可以使用更多哈希来避免误报


如果我没有把事情搞糊涂的话,还有一个解决方案涉及到,但我对它已经不太熟悉了。

一个简单的θ(n)方法(对于n个字符的输入字符串S)是在θ(n)时间内为S构建一个T。设R=反向(S)。在时间O(n)中,使用T在S的后缀中查找R的最长匹配。假设最长匹配有m个字符;也就是说,R的前m个字符与S的最后m个字符匹配,m是最大的。设P为R的最后n-m个字符,或S的前n-m个字符的倒数。期望的结果是S+P。

最小的回文是
a
。我想你是说最大的回文?您如何从
abab
制作
abab
?你可以重复使用信件吗?还不完全清楚…规则是“您的回文必须使用字符串中的每个字母(包括重复的字母),以及完成回文所需的字母数。因此总是>N”?什么??这个问题是你自己提出的吗?不,我是在topcoder上找到的。你在编辑除了标题以外的所有内容,为什么它是最小的呢?@IVIad现在我完全明白了。感谢您在回答中编辑的实现。