hash function 把一个string对应到某一个位置 ,然后下次他来的时候还是这个位置,可以检查看是否存在于整个数组当中
字符转换成整数 0-255 一个字节 可以直接乘 出来就是整数 语言会自动转换 乘以任何数字都可以 这里31是常用的,基数num
效率最高,效果最好
这个结果可能很大 超出证书的范围 取模
模2出来一半是0一半是1 不够比较 除以一个比较大的数
整个时间复杂度O(N+M) 所以一样的很少
Rabin Karp Algorithm。用Hash方程的思想做。自己实现Hash function。
1.提前算好target的code。
2.开始读入source的每个字符,在for循环里计算所有长度为target.length()的子字符串的hashcode。
3.对比,如果code一样,要进一步对比是否substring的确一样以排除false positive.
细节:
1.第二步内比如从abc -> bcd,for循环每次都加了新的字符,d已经被加上去了,你只要轻松地排除窗口刚滑走的a幂次即可。因为幂次固定是31target.length(),可以提早把幂次算好。
2.对%BASE这个操作每次计算别忘了。
3.对两个各自对BASE取余过的数做减法后,可能会出来负数,这时候不好
public class Solution{
public int BASE=1000000