📜  回文子串查询

📅  最后修改于: 2021-10-27 09:10:56             🧑  作者: Mango

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

例子 :

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

方法 1(幼稚)

我们逐一遍历查询的所有子串并检查所考虑的子串是否是回文。

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

方法二(累积哈希)

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

如何计算累积哈希值?

假设我们的字符串是 str[],那么用于填充我们的 prefix[] 数组的累积散列函数是-

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

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

例如,hash (1, 5) = hash (“baaab”) = prefix[6] – prefix[1] = 98 * 101 + 97 * 101 2 + 97 * 101 3 + 97 * 101 4 + 98 * 101 5 = 1040184646587 [我们稍后将使用这个奇怪的值来解释发生了什么]。

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