【问题标题】:Compute hash of a substring given the hashes of all prefixes of the string给定字符串的所有前缀的哈希值,计算子字符串的哈希值
【发布时间】:2014-06-18 01:03:34
【问题描述】:

假设给定一个长度为N 的字符串S,以及字符串Shash[0][0...N-1] 的所有前缀的哈希值数组。

hash[0][i] 表示以索引i 结尾的字符串S 前缀的哈希值。 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]。给定上述信息,我们能否找出O(1)S子串的哈希值,即hash[i][j]

where, i,j &gt; 0 and i,j &lt; N

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

【问题讨论】:

    标签: java string algorithm hash


    【解决方案1】:

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

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

    使用模幂来计算 R mod M 的幂。不,除非您预先计算 R 的幂,否则不可能在 O(1) 中计算它。

    【讨论】:

      猜你喜欢
      • 2011-12-02
      • 2020-11-18
      • 2011-04-26
      • 2012-07-12
      • 1970-01-01
      • 2019-08-08
      • 2021-12-15
      • 1970-01-01
      • 2013-02-16
      相关资源
      最近更新 更多