首页 > 其他分享 >字符串哈希

字符串哈希

时间:2023-11-05 09:22:24浏览次数:38  
标签:__ 10 self BASE 哈希 字符串 def MOD

算法原理: 将一个字符串看成是一个P 进制的数字。

代码模板:

  def __init__(self, s):
        n = len(s)
        self.BASE = BASE = 131  # 进制 131,131313
        self.MOD = MOD = 10 ** 13 + 7  # 10**9+7,998244353,10**13+7
        self.h = h = [0] * (n + 1)
        self.p = p = [1] * (n + 1)
        for i in range(1, n + 1):
            p[i] = (p[i - 1] * BASE) % MOD
            h[i] = (h[i - 1] * BASE % MOD + ord(s[i - 1])) % MOD

 def get_hash(self, l, r):
        return (self.h[r] - self.h[l - 1] * self.p[r - l + 1] % self.MOD) % self.MOD


h = sh.get_hash(l, r)

// 注意这里有个映射,我们的字符串哈希值从1开始,题目中给出的字符串多从0开始,从str -> h 只要所有下标都加1 即可。

 

 

 

class StringHash:
    def __init__(self, s: str):
        n = len(s)
        self.MOD = MOD = 10**13 + 7
        self.BASE = BASE = 131
        self.h = h = [0] * (n + 10)
        self.p = p = [1] * (n + 10)
        for i in range(1, n + 1):
            p[i] = (p[i - 1] * BASE) % MOD
            h[i] = (h[i - 1] * BASE % MOD + ord(s[i - 1])*2) % MOD

    def get_hash(self, l, r):
        return (self.h[r + 1] - self.h[l] * self.p[r - l + 1] % self.MOD) % self.MOD

class Solution:
    def findRepeatedDnaSequences(self, s: str) -> List[str]:
        hs = StringHash(s)
        n = len(s)

        vis = Counter()
        ans = []

        for i in range(n - 9):
            h = hs.get_hash(i,i+9)
            vis[h] += 1
            if vis[h] == 2:
                ans.append(s[i:i+10])

        return ans

 

标签:__,10,self,BASE,哈希,字符串,def,MOD
From: https://www.cnblogs.com/zk6696/p/17810236.html

相关文章

  • 字符串的属性与方法
    字符串的属性与方法属性;length长度 字符串是个伪数组//vartemp=newString('hello');//for(vari=0;i<temp.length;i++){//console.log(temp[i]);//}    //varstr='hello';    //console.log(str.le......
  • 字符串类型
    1.B-BeautifulStrings(atcoder.jp)代码:1#include<bits/stdc++.h>2usingnamespacestd;34intn;5intcnt[500];6strings;7intmian(){8cin>>s;9n=s.size();10s=''+s;1112for(inti=1;i<......
  • MySQL 获取MySQL列中字符串出现的次数
    使用SUM()和LIKE语句计算字符串出现次数首先,我们可以使用SUM()函数和LIKE语句计算特定字符串在某一列中出现的次数。具体实现方法如下:SELECTSUM(CASEWHENcolumn_nameLIKE'%search_string%'THEN1ELSE0END)assearch_countFROMtable_name;SQLCopy其中,column_name为需要......
  • Mysql查询字符串中某个字符串出现的次数
    目录1.查单个字符出现的次数2.查多个字符出现的次数3.函数讲解1.查单个字符出现的次数比如我想查howdoyoudo字符串当中出现d的次数:第一眼看上去有点懵,首先mysql并没有直接计算出现字符次数的函数,所以才使用了下面这种方式,其实就是将出现的字符串给替换为了空。然后让原数据减去......
  • MATLAB-字符串处理
    ✅作者简介:热爱科研的算法开发者,Python、Matlab项目可交流、沟通、学习。......
  • 字符串匹配算法:KMP
    Knuth–Morris–Pratt(KMP)是由三位数学家克努斯、莫里斯、普拉特同时发现,所有人们用三个人的名字来称呼这种算法,KMP是一种改进的字符串匹配算法,它的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。它的时间复杂度是O(m+n)字符匹配:给你两个字符......
  • 教3妹学编程-算法题】2914. 使二进制字符串变美丽的最少修改次数
    3妹:呜呜,烦死了,脸上长了一个痘2哥 :不要在意这些细节嘛,不用管它,过两天自然不就好了。3妹:切,你不懂,影响这两天的心情哇。2哥 :我看你是不急着找工作了啊,工作那么辛苦,哪还有时间想这些啊。3妹:说到找工作,我又要去刷题了。2哥:我给你出一道关于美丽的题吧,让你的心情美丽美丽~ 1题目......
  • AI问答:关于字符串匹配算法的区别及应用场景,哈希/kmp/字典树/AC自动机
    1. 哈希(Hashing):哈希是一种将字符串转换为唯一标识符的技术,通常用于字符串的快速查找和比较。实现难度相对较低,但需要处理哈希冲突的问题。哈希在处理大量数据的查找和比较问题时非常实用。2. KMP(Knuth-Morris-Pratt):KMP 是一种用于字符串匹配的算法,特别适用于查找子串在主串中的......
  • python 字符串格式化
    Python字符串的格式化分为两种:1)%方式  2)str.format() 方式。str.format()是比%较新的方式,大多数的Python代码仍然使用%操作符。但最终会被str.format()代替,推荐使用str.format()==============================================================================......
  • 如何更新哈希映射中给定键的值?
    内容来自DOChttps://q.houxu6.top/?s=如何更新哈希映射中给定键的值?假设我们在Java中有一个HashMap<String,Integer>。如何更新(递增)我找到的每个字符串键的整数值?人们可以删除并重新输入键值对,但担心会有性能问题。另一种方法是只插入新的键值对,旧的将被替换。在后一种......