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[k1])pk1)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、原题链接

LeetCode 2155. 分组得分最高的所有下标

二、解题报告

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:k1] 的哈希值是:
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,k1)=(g(0)p0+g(1)p1+...+g(k1)pk1) mod m
   ( 3 ) (3) (3) 对于一个从 i i i 开始,长度为 k k k 的字符串 s [ i : i + k − 1 ] s[i:i+k-1] s[i:i+k1],它的哈希值等于:
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+k1)=(g(i)p0+...+g(i+k1)pk1) 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)pk1) 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)ph(i,i+k1)=g(i+k)pkg(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+k1)=h(i+1,i+k)pg(i+k)pk+g(i)
   ( 7 ) (7) (7) 转化成后缀和求解,对于长度为 n n n 的字符串,初始情况就是 h ( n − k , n − 1 ) h(n-k, n-1) h(nk,n1)

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实现

Leetcode练习(Python):哈希表类:第3题:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。