diff --git a/算法周更班/class_2023_05_5_week/Code04_StringHash.java b/算法周更班/class_2023_05_5_week/Code04_StringHash.java index e064edc..5075db8 100644 --- a/算法周更班/class_2023_05_5_week/Code04_StringHash.java +++ b/算法周更班/class_2023_05_5_week/Code04_StringHash.java @@ -7,18 +7,18 @@ package class_2023_05_5_week; // " 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[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次方 +// 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的2次方 = 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)次方