leetcode中等2156查找给定哈希值的子串
Posted qq_40707462
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode中等2156查找给定哈希值的子串相关的知识,希望对你有一定的参考价值。
给定整数 p 和 m ,一个长度为 k 且下标从 0 开始的字符串 s 的哈希值按照如下函数计算:
hash(s, p, m) = (val(s[0]) * p0 + val(s[1]) * p1 + ... + val(s[k-1]) * pk-1) mod m
.
其中 val(s[i]) 表示 s[i] 在字母表中的下标,从 val(‘a’) = 1 到 val(‘z’) = 26 。
给你一个字符串 s 和整数 power,modulo,k 和 hashValue 。请你返回 s 中 第一个 长度为 k 的 子串 sub ,满足 hash(sub, power, modulo) == hashValue
。
示例 1:
输入:s = "leetcode", power = 7, modulo = 20, k = 2, hashValue = 0
输出:"ee"
解释:"ee" 的哈希值为 hash("ee", 7, 20) = (5 * 1 + 5 * 7) mod 20 = 40 mod 20 = 0 。
"ee" 是长度为 2 的第一个哈希值为 0 的子串,所以我们返回 "ee" 。
示例 2:
输入:s = "fbxzaad", power = 31, modulo = 100, k = 3, hashValue = 32
输出:"fbx"
解释:"fbx" 的哈希值为 hash("fbx", 31, 100) = (6 * 1 + 2 * 31 + 24 * 312) mod 100 = 23132 mod 100 = 32 。
"bxz" 的哈希值为 hash("bxz", 31, 100) = (2 * 1 + 24 * 31 + 26 * 312) mod 100 = 25732 mod 100 = 32 。
"fbx" 是长度为 3 的第一个哈希值为 32 的子串,所以我们返回 "fbx" 。
注意,"bxz" 的哈希值也为 32 ,但是它在字符串中比 "fbx" 更晚出现。
思路:滑动窗口 、动态规划,倒着
正常思路,维持一个大小为 k 的滑动窗口,但是每次窗口右移,没法处理除法取模。但是如果从后向前移动窗口,就变成乘法取模,可以解决
预处理 s 中最后一个长度为 k 子串的哈希值 h(n - k, p, m)
与 pkmod m
,就可以依次计算出其余每个长度为 k 子串的哈希值。
hash[i] 表示后缀子串 s[i,n) 的哈希值
递推式: hash[i] = val(s[i]) + hash[i+1] * p
如:
以 abcde 为例,假设求子串 s[0,2) 的哈希值, 此时k=2
hash[0] = val(a)*p0 + val(b)*p1 + val©*p2 + val(d)*p3 + val(e)*p4
hash[2] = val ( c)*p0 + val(d)*p1 + val(e)*p2
使用 hash[0] - hash[2] * pk 把末尾几项消掉
留下的前面2项是 s[0,2)的哈希值
class Solution
public String subStrHash(String s, int power, int modulo, int k, int hashValue)
int n=s.length();
long pk=1;
long[] h = new long[n + 1];
for(int i = 0; i < k; i++)
pk=pk*power%modulo;
for (int i = n - 1; i >= 0; i--)
h[i] = h[i + 1] * power + (s.charAt(i) - 'a' + 1);
h[i] %= modulo;
int res=0;//目标子段的起始坐标
for(int i=n-k;i>=0;i--)
long temp=(h[i]-h[i+k]*pk)%modulo;
temp=(temp+modulo)%modulo;//害怕减法为负数
if(temp==hashValue) res=i;
return s.substring(res,res+k);
以上是关于leetcode中等2156查找给定哈希值的子串的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode53.最大子串和(简单)76.最小子串覆盖(困难)3. 最长子串不重复问题(中等)
Leetcode53.最大子串和(简单)76.最小子串覆盖(困难)3. 最长子串不重复问题(中等)