📜  回文子串查询

📅  最后修改于: 2021-04-26 18:31:00             🧑  作者: Mango

给定一个字符串和对给定输入字符串的子字符串的几个查询,以检查该子字符串是否是回文。

例子 :

让我们假设有Q个这样的查询要回答,而N是我们输入字符串的长度。有以下两种方式来回答这些查询

方法1(天真)

我们一个接一个地遍历查询的所有子字符串,并检查所考虑的子字符串是否是回文。

由于存在Q个查询,并且每个查询可能需要O(N)个最坏情况的时间来回答,因此此方法在最坏情况下需要O(QN)个时间。尽管这是一种就地/空间高效的算法,但仍有一种更有效的方法可以做到这一点。

方法2(累积哈希)

这个想法类似于Rabin Karp字符串匹配。我们使用字符串哈希。我们要做的就是,我们计算出原始字符串以及两个arrays-前缀[]和后缀[]反转字符串字符串的累积哈希值。

如何计算累积哈希值?

假设我们的字符串是str [],则填充我们使用的prefix []数组的累积哈希函数为-

现在以这种方式存储的原因是,我们可以轻松地在O(1)时间中找到任何子字符串的哈希值-

hash(L, R) = prefix[R+1] – prefix[L]

例如,哈希(1,5)=哈希(“ baaab”)=前缀[6] –前缀[1] = 98 * 101 + 97 * 101 2 + 97 * 101 3 + 97 * 101 4 + 98 * 101 5 = 1040184646587 [我们稍后将使用此怪异值来解释发生了什么]。

与此类似,我们将suffix []数组填充为-