modify code

master
algorithmzuo 2 years ago
parent abb9862872
commit 24fbbea88d

@ -1,6 +1,30 @@
package class_2023_05_5_week;
// 字符串哈希原理和实现
// 课上讲的时候有错误,代码没错,解释有错
// 重新解释一下:
// 比如p = 233, 也就是课上说的选择的质数进制
// " 3 1 2 5 6 ..."
// 0 1 2 3 4
// hash[0] = 3 * p的0次方
// hash[1] = 3 * p的1次方 + 1 * p的0次方
// hash[2] = 3 * p的2次方 + 1 * p的1次方 + 2 * p的0次方
// hash[3] = 3 * p的3次方 + 1 * p的2次方 + 2 * p的1次方 + 5 * p的0次方
// hash[4] = 3 * p的4次方 + 1 * p的3次方 + 2 * p的2次方 + 5 * p的1次方 + 6 * p的0次方
// 次方是倒过来的,课上讲错了
// 所以hash[i] = hash[i-1] * p + arr[i],这个方式就可以得到上面说的意思
// 于是,你想得到子串"56"的哈希值
// 子串"56"的哈希值 = hash[4] - hash[2]*p的2次方(就是子串"56"的长度次方)
// hash[4] = 3 * p的4次方 + 1 * p的3次方 + 2 * p的2次方 + 5 * p的1次方 + 6 * p的0次方
// hash[2] = 3 * p的2次方 + 1 * p的1次方 + 2 * p的0次方
// hash[2]*p的平方 = 3 * p的4次方 + 1 * p的3次方 + 2 * p的2次方
// 所以hash[4] - hash[2]*p的2次方 = 5 * p的1次方 + 6 * p的0次方
// 这样就得到子串"56"的哈希值了
// 抱歉,课上讲错了。应该是上面的方式。
// 所以子串s[l...r]的哈希值 = hash[r] - hash[l-1] * p的(r-l+1)次方
// 也就是说hash[l-1] * p的(r-l+1)次方正好和hash[r]所代表的信息,前面对齐了
// 减完之后正好就是子串s[l...r]的哈希值
// 代码是对的,后续的题目实现也是对的,就是解释错了,抱歉抱歉!
public class Code04_StringHash {
// 暴力方法

Loading…
Cancel
Save