目录

力扣总结 算法进阶(二):滚动哈希

滚动哈希是一种针对固定长度的滑动窗口的哈希方法。

朴素的哈希需要对所有窗口单独求哈希值,时间复杂度和空间复杂度都和窗口长度相关。 用滚动哈希则可以递推求得相邻窗口的哈希值,优化为线性复杂度。

一般采用 Rabin-Karp 算法来实现滚动哈希。核心思想就是将窗口 W 看作是一个 base 进制的数:

$$hash(W)=\sum_{i=0}^{|W|-1}base^{|W|-(i+1)}*W[i]$$

base 取一个大于元素范围的数,该 base 进制的数就唯一对应一个窗口。

特别注意,当哈希值很大必须要取模时,为了尽量避免哈希冲突,base 取一个大于 元素种数质数, 而mod 应该取一个大于 窗口种数^2质数

1 基础

  • 0187 重复的DNA序列

2 进阶

  • 0718 最长重复子数组
  • 1392 最长快乐前缀

3 挑战

  • 1044 最长重复子串
  • 1316 不同的循环子字符串
  • 1923 最长公共子路径