Rabin-Karp算法

用途

此算法主要用来解决字串匹配问题,例如设s为一个字符串,s1为一个字串,我们的目的是判断s中是否存在s1,也可以判断有多少s1字串

解决

  1. 对于此问题的解决,可以采用暴力解法,即从s中逐个字串的查找,然后判断是否存在,其优点是不需要对字串进行预处理,缺点是时间复杂度太高O(MN)
  2. 采用Rabin-Karp算法,该算法的主要思想是采用哈希,把字符串计算成一个哈希值,然后判断是否相等

Rabin-Karp算法具体实现

我们假设字符串中只包含小写字符,则进制为26进制,我们设字串中字符的个数为m,则字串的哈希值的计算为:
hash(s1)=s1[0]*dm-1 *+s1[1]dm-2+…+s1[m-1] (其中d为进制数)
同理,对字符串s(设字符的个数为n)也采用此算法进行计算,s能够截取的字串一共有m-n+1个可能。对于每一个字串我们无需重新计算,可以利用上一步的结果进行计算,例如我们设划片的哈希值为hash(s[0]) 表示从0开始截取的字串的哈希值,则hash(s[1])=d
(hash(s[0])-s[0]*dm-1 )+s[n]
此外如果哈希值过大我们也可以采用求模运算缩小哈希值,但带来的缺点是会造成哈希冲突。
具体问题:

所有 DNA 都由一系列缩写为 ‘A’,‘C’,‘G’ 和 ‘T’ 的核苷酸组成,
例如:“ACGAATTCCG”。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。编写一个函数来找出所有目标子串,目标子串的长度为 10,且在 DNA 字符串 s 中出现次数超过一次

示例 1:
输入:s = “AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT”
输出:[“AAAAACCCCC”,“CCCCCAAAAA”]

问题分析

此问题即字符串匹配问题,我们可以设A=0,C=1,G=2,T=3即四进制的数,然后每取10个字串计算一次哈希值即可

代码实现

class Solution {public:vector<string> findRepeatedDnaSequences(string s) {/*unordered_map<string,int> m;vector<string> res;int size=s.size();int start=0;string s1;while(start<=size-10){s1=s.substr(start,10);if(m[s1]==1) res.emplace_back(s1);m[s1]++;start++;}return res;*///不取余数的情况下不会有冲突 取余数则可能冲突int n=s.size(),d=4,m=10;vector<string> res;map<char,int> f;map<int,int> hash; //用来保存哈希值f['A']=0; f['C']=1; f['G']=2;f['T']=3;int h=0;for(int i=0;i<n-m+1;i++){h=0;for(int j=0;j<m;j++){h=h*d+f[s[i+j]];}if(hash[h]==1){res.emplace_back(s.substr(i,m));}hash[h]++;}return res;}
};

Rabin-Karp相关推荐

  1. Go 语言实现字符串匹配算法 -- BF(Brute Force) 和 RK(Rabin Karp)

    今天介绍两种基础的字符串匹配算法,当然核心还是熟悉一下Go的语法,巩固一下基础知识 BF(Brute Force) RK(Rabin Karp) 源字符串:src, 目标字符串:dest: 确认des ...

  2. SPOJ Substring Problem(Rabin Karp TLE)

    给出一个文本串及n个模式串,检查对应的模式串是否在文本串中出现 使用rabin karp算法超时 代码见: https://github.com/wuli2496/OJ/blob/master/spo ...

  3. C++Rabin Karp算法字符串快速查找(附完整源码)

    C++Rabin Karp算法字符串快速查找 C++Rabin Karp算法字符串快速查找完整源码(定义,实现,main函数测试) C++Rabin Karp算法字符串快速查找完整源码(定义,实现,m ...

  4. leetcode 1044. Longest Duplicate Substring | 1044. 最长重复子串(Rabin Karp算法)

    题目 https://leetcode.com/problems/longest-duplicate-substring/ 题解 这题暴力超时,看了 Related Topics,以及 Hint,主要 ...

  5. Rabin Karp 算法详解及Python实现

    目录 一.Rabin Karp 核心思路 二.字符串如何做哈希映射 三.借助前缀和列表计算滑动窗口 四.leetcode28. 代码实现 Rabin Karp 算法是用于实现字符串的模式匹配,先看le ...

  6. SPOJ Pattern Find(Rabin Karp)

    使用Rabin-Karp算法. 代码参考: OJ/spoj/Pattern Find at master · wuli2496/OJ · GitHub

  7. 字符串匹配算法 -- BM(Boyer-Moore) 和 KMP(Knuth-Morris-Pratt)详细设计及实现

    文章目录 1. 算法背景 2. BM(Boyer-Moore)算法 2.1 坏字符规则(bad character rule) 2.2 好后缀规则(good suffix shift) 2.3 复杂度 ...

  8. 看动画学算法系列之:后缀树suffix tree

    文章目录 简介 字典树Trie 压缩字典树 后缀树Suffix Tree 后缀树的搜索 查找最长重复子字符串 查找两个字符串的最长公共子字符串 后缀树的代码实现 简介 模式匹配是一个在工作中经常会用到 ...

  9. java indexof效率_Java indexOf函数比Rabin-Karp更有效吗?文字搜寻效率

    几周前,我向Stackoverflow提出了一个问题,该问题涉及如何创建一种有效的算法来搜索大量文本中的模式.现在,我正在使用String函数indexOf进行搜索.一个建议是使用Rabin- Kar ...

  10. 经典算法题:字典树、并查集、单调栈、二分、带标记函数dp、树、全排列、字符串问题等常用算法

    0. Tips 1. 位运算 如何枚举一个二进制状态数字k的子集, 方法就是针对中的二进制为1的位开始进行减法,判断数字k的二进制子集, 像枚举(2^k-1) ~ 0一样枚举其子集: int sub ...

最新文章

  1. mysql查询各个知识点
  2. er图转为数据流程图_draw.io for Mac(流程图绘制工具)
  3. [转]Javascript 绝句
  4. 投资人赞上海某寺很靠谱 饿了么曾获10万元天使投资
  5. 【Python】Python中的引用和赋值
  6. 干货来袭!java核心技术卷一pdf
  7. CCF202104-3 DHCP服务器(100分)【模拟】
  8. HDU1556 Color the ball【差分数组+线段树】
  9. python做社会网络分析_利用GooSeeker分词、Ucient和NetDraw进行社会网络分析
  10. cc攻击的原理和处理方式
  11. html5中的 hr定位,被大家遗忘的 hr 标签元素
  12. 情感分类模型介绍CNN、RNN、LSTM、栈式双向LSTM
  13. prompt learning
  14. 用于自然语言理解的多任务深度神经网络
  15. 入侵oracle数据库时常用的操作命令整理
  16. maven仓库已经存在jar包但是还是显示引入错误/失败
  17. 其实,Face ID只是iPhone X TrueDepth相机的冰山一角
  18. Flutter 不容错过的 7 大亮点 | Google I/O 精彩回顾
  19. 盘点那些具有特色的写作软件
  20. mac php安装扩展名,Mac自带的php怎么安装扩展

热门文章

  1. FOSS社区可以拯救197种濒临灭绝的印度语言吗?
  2. csdn请勿使用默认标题是什么意思
  3. C语言 学生成绩管理 txt存储数据
  4. 打砖块(brike)
  5. linux raw图片处理软件,Kandao Raw+下载-Raw图片处理软件 v1.1.2.1 官方版 - 下载吧
  6. Android实现购物车详情简单效果
  7. 穹顶之下,企业建站怎么做?网站建设怎么做?建网站有几大步骤?
  8. 为字体文件增添自定义图标
  9. ReactNative进阶(三十一): IoC 框架 InversifyJS 解读
  10. 常见的化学测试有哪些?--CPSIA、ROHS、REACH、FDA检测、加州65