给定字符串的所有前缀的哈希值,计算子字符串的哈希值

时间:2014-05-01 14:21:12

标签: java string algorithm hash

假设您获得长度为S的字符串N以及字符串S hash[0][0...N-1]的所有前缀的哈希值数组。

hash[0][i]表示以索引S结尾的字符串i的前缀的哈希值。 M表示一个大的整数。 R表示哈希函数中使用的基数。

您还会获得使用的哈希函数:

for(int i = 0; i < N; i++) {
    hash[0][i] = ( (i > 0 ? hash[0][i - 1] : 0) * R + S.charAt(i) ) % M;
}

我们需要根据需要计算hash[i][j]。在给出上述信息的情况下,我们能否找到SO(1)的子字符串的哈希值,即hash[i][j]

where, i,j > 0 and i,j < N

注意:数组hash[][]最初只包含字符串hash[0][0....N-1]前缀的预先计算的哈希S

1 个答案:

答案 0 :(得分:2)

子串s [A..B]的哈希是

hash[B] - R^(B - A + 1) * hash[A - 1] mod M

使用模幂运算来计算R mod M的幂。除非你预先计算了R的幂,否则无法在O(1)中计算它。