LeetCode 2156. 查找给定哈希值的子串
Posted 英雄哪里出来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 2156. 查找给定哈希值的子串相关的知识,希望对你有一定的参考价值。
文章目录
一、题目
1、题目描述
给定整数 p p p 和 m m m ,一个长度为 k k k 且下标从 0 0 0 开始的字符串 s s s 的哈希值按照如下函数计算:
h a s h ( s , p , m ) = ( v a l ( s [ 0 ] ) ∗ p 0 + v a l ( s [ 1 ] ) ∗ p 1 + . . . + v a l ( s [ k − 1 ] ) ∗ p k − 1 ) m o d m hash(s, p, m) = (val(s[0]) * p^0 + val(s[1]) * p^1 + ... + val(s[k-1]) * p^k-1) \\mod m hash(s,p,m)=(val(s[0])∗p0+val(s[1])∗p1+...+val(s[k−1])∗pk−1)modm
其中 v a l ( s [ i ] ) val(s[i]) val(s[i]) 表示 s [ i ] s[i] s[i] 在字母表中的下标,从 v a l ( ′ a ′ ) = 1 val('a') = 1 val(′a′)=1 到 v a l ( ′ z ′ ) = 26 val('z') = 26 val(′z′)=26 。给你一个字符串 s s s 和整数 p o w e r power power, m o d u l o modulo modulo, k k k 和 h a s h V a l u e hashValue hashValue。请你返回 s s s 中 第一个 长度为 k k k 的 子串 s u b sub sub ,满足hash(sub, power, modulo) == hashValue
。测试数据保证一定 存在 至少一个这样的子串。
样例输入:nums = [0,0,1,0]
样例输出:[2,4]
2、基础框架
- C语言 版本给出的基础框架代码如下:
char * subStrHash(char * s, int power, int modulo, int k, int hashValue)
3、原题链接
二、解题报告
1、思路分析
(
1
)
(1)
(1) 把
v
a
l
(
s
[
i
]
)
val(s[i])
val(s[i])化简为
g
(
i
)
g(i)
g(i)
(
2
)
(2)
(2) 对于长度为 k
的字符串
s
[
0
:
k
−
1
]
s[0:k-1]
s[0:k−1] 的哈希值是:
h
(
0
,
k
−
1
)
=
(
g
(
0
)
p
0
+
g
(
1
)
p
1
+
.
.
.
+
g
(
k
−
1
)
p
k
−
1
)
m
o
d
m
h(0, k-1) = (g(0) p^0 + g(1) p^1 + ... + g(k-1) p^k-1) \\ mod \\ m
h(0,k−1)=(g(0)p0+g(1)p1+...+g(k−1)pk−1) mod m
(
3
)
(3)
(3) 对于一个从
i
i
i 开始,长度为
k
k
k 的字符串
s
[
i
:
i
+
k
−
1
]
s[i:i+k-1]
s[i:i+k−1],它的哈希值等于:
h
(
i
,
i
+
k
−
1
)
=
(
g
(
i
)
p
0
+
.
.
.
+
g
(
i
+
k
−
1
)
p
k
−
1
)
m
o
d
m
h(i, i+k-1) = (g(i) p^0 + ... + g(i+k-1) p^k-1) \\ mod \\ m
h(i,i+k−1)=(g(i)p0+...+g(i+k−1)pk−1) mod m
(
4
)
(4)
(4) 则从
i
+
1
i+1
i+1 开始,长度为
k
k
k 的字符串
s
[
i
+
1
:
i
+
k
]
s[i+1:i+k]
s[i+1:i+k],它的哈希值等于:
h
(
i
+
1
,
i
+
k
)
=
(
g
(
i
+
1
)
p
0
+
.
.
.
+
g
(
i
+
k
)
p
k
−
1
)
m
o
d
m
h(i+1, i+k) = (g(i+1) p^0 + ... + g(i+k) p^k-1) \\ mod \\ m
h(i+1,i+k)=(g(i+1)p0+...+g(i+k)pk−1) mod m
(
5
)
(5)
(5) 对相邻两个字符串的哈希值进行处理,得到:
h
(
i
+
1
,
i
+
k
)
p
−
h
(
i
,
i
+
k
−
1
)
=
g
(
i
+
k
)
p
k
−
g
(
i
)
h(i+1, i+k)p - h(i, i+k-1) = g(i+k) p^k - g(i)
h(i+1,i+k)p−h(i,i+k−1)=g(i+k)pk−g(i)
(
6
)
(6)
(6) 移项(仔细仔细),得到:
h
(
i
,
i
+
k
−
1
)
=
h
(
i
+
1
,
i
+
k
)
p
−
g
(
i
+
k
)
p
k
+
g
(
i
)
h(i, i+k-1) = h(i+1, i+k)p - g(i+k) p^k + g(i)
h(i,i+k−1)=h(i+1,i+k)p−g(i+k)pk+g(i)
(
7
)
(7)
(7) 转化成后缀和求解,对于长度为
n
n
n 的字符串,初始情况就是
h
(
n
−
k
,
n
−
1
)
h(n-k, n-1)
h(n−k,n−1)
2、时间复杂度
O ( n ) O(n) O(n)。
3、代码详解
int g(char c)
return (c - 'a' + 1);
解题报告力扣 第 278 场周赛
leetcode 30. 串联所有单词的子串----滑动窗口篇八
LeetCode 686. 重复叠加字符串匹配 / 1044. 最长重复子串(字符串哈希) / 1705. 吃苹果的最大数目
LeetCode 686. 重复叠加字符串匹配 / 1044. 最长重复子串(字符串哈希) / 1705. 吃苹果的最大数目
Leetcode练习(Python):哈希表类:第3题:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。