主要作用:能够在线性复杂度内求出一个串在另一个串的所有匹配位置。

说明:设模板串是 pattern, 令 next[i] = max{k|[pattern[0..k−1] = pattern[i−k+l..i] 得到。求解next[i]可以使用动态规划,即 next[i+1] 可以由next[i],next[next[i]],…得到。
得到next[i]们数组之后,设两个指针i和j,分别指向文本串和模式串,成功匹配得向后移动j,否则把/移动到 next[j]。 当j移动到模式串末尾时,就说明匹配成功。

首先是next[i]数组

vector<int> get_next(string ss)
{//next[i] ,下标为i的 字符前 最长相等前后缀的长度int n = ss.size();vector<int>next(n + 1, 0);for (int i = 1; i < n; ++i){int j = i;while (j > 0){// 动态规划j = next[j];if (ss[j] == ss[i]){// i+1 是因为当前的前后缀相等的是其后边的结果next[i + 1] = j + 1;break;}}}return next;
}

KMP 匹配

 vector<int>position;int m = text.size();for (int i = 0, j = 0; i < m; ++i){//cout << "j :" << j << endl;if (j < n && text[i] == pattern[j])++j;else{while (j > 0) //因为没有如果没有,next[j] 的值是0{// 回溯到最优位置,如果不为0,那么该位置前边 next[j] -1的元//     素与i位置前边next[j] -1元素是一样的j = next[j];if (text[i] == pattern[j])//作用是如果回溯到的地方匹配上了,就从这个地方开始匹配{j++;//因为循环中有 i++break;}}}if (j == n)position.push_back(i - n + 1);}

综合:

vector<int> find_substring(string pattern, string text)
{//next[i] ,下标为i的 字符前 最长相等前后缀的长度int n = pattern.size();vector<int>next(n + 1, 0);for (int i = 1; i < n; ++i){int j = i;while (j > 0){// 动态规划j = next[j];if (pattern[j] == pattern[i]){// i+1 是因为当前的前后缀相等的是其后边的结果next[i + 1] = j + 1;  break;}}}vector<int>position;int m = text.size();for (int i = 0, j = 0; i < m; ++i){if (j < n && text[i] == pattern[j])++j;else{while (j > 0){// 回溯到最优位置,如果不为0,那么该位置前边 next[j] -1的元素与i位置前边next[j] -1元素是一样的j = next[j];if (text[i] == pattern[j]){j++;break;}}}if (j == n)position.push_back(i - n + 1);}return next;
}

详细解释可以看这篇文章:
KMP算法详解

KMP算法之 好理解的模板相关推荐

  1. 我关于KMP算法的初步理解

    唔,时间过得好快,下学期都过了一半了,因为寒假玩去了,数据结构也没学完.后来看到KMP算法的时候,第一次一晚上就想一个问题,当然,总算是有些眉目了,下面是我对KMP算法的一些理解,当然还没有看完,但是 ...

  2. KMP算法的简单理解

    引入 对于串的匹配,较为简单的有BF算法,但这种方法的可用性却较差.因为在每次不匹配的时候,主串(m位)和子串(n位)都会回溯,有一种最坏的情况就是,主串每前进一位,都在n次匹配后失败然后回溯,如: ...

  3. KMP算法最浅显理解——一看就明白

    说明 KMP算法看懂了觉得特别简单,思路很简单,看不懂之前,查各种资料,看的稀里糊涂,即使网上最简单的解释,依然看的稀里糊涂. 我花了半天时间,争取用最短的篇幅大致搞明白这玩意到底是啥. 这里不扯概念 ...

  4. KMP算法详解P3375 【模板】KMP字符串匹配题解

    KMP算法详解: KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt(雾)提出的. 对于字符串匹配问题(such as 问你在abababb中有多少个 ...

  5. 深化对KMP算法的理解

    KMP算法 看到这么一句话:你的名字是我告白语中的子串 文章目录 KMP算法 参考代码 预处理模式串的理解 入门题目 KMP一开始理解起来是比较困难的,下方是结合自己的理解写出来代码,仅作参考, (网 ...

  6. BF算法优化-------KMP算法

    百度百科:KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的核心是利用 ...

  7. [算法系列之二十六]字符串匹配之KMP算法

    一 简介 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的关键是利 ...

  8. KMP算法图文详解(为什么是next[0]=-1、next[j]=k和k=next[k])

    文章目录 一:KMP算法解决的问题 二:详解KMP (1)暴力匹配的缺点 (2)最长相同前缀和后缀 (3)究竟怎么回溯 (3)next数组 (4)求解next数组 A:next[0]=-1 B:nex ...

  9. KMP算法——很详细的讲解

    前段时间学习KMP算法,感觉有些复杂,不过好歹是弄懂啦,简单地记录一下,方便以后自己回忆. 引入 首先我们来看一个例子,现在有两个字符串A和B,问你在A中是否有B,有几个?为了方便叙述,我们先给定两个 ...

最新文章

  1. 100万年薪只是起步价!跨境AI人才遭疯抢后最终去了哪儿?
  2. python列表(list)中出现次数最多的元素使用collection包的Counter方法
  3. Win10 Terminal + WSL 2 安装配置指南,精致开发体验 - 知乎 (zhihu.com)
  4. 机械爪角度与距离之间的关系
  5. UE4学习-虚幻4帮助手册、通过蓝图实现动画效果、添加时间轴、添加声音、C++和蓝图事件关联
  6. html动画转换为桌面动态壁纸,动态桌面:把精彩的flash动画设为桌面
  7. windows下gvim中文乱码解决方案
  8. u-boot向linux内核传递启动参数
  9. android设置成默认应用程序,在Android中设置和取消设置默认应用
  10. Android Intent组件使用
  11. Windows防火墙添加80端口,解决apache无法访问的问题
  12. android shape 绘制气泡图,气泡图-自定义 shape
  13. kafka--Struct Streaming--mysql案例
  14. 微信小程序如何获取token
  15. 高德地图 js自动定位到当前城市
  16. 初探Java设计模式4:JDK中的设计模式
  17. 关于智能运维(AIOps)的学与思
  18. 转行做软件编程开发的经历
  19. PostgreSQL t_bits计算方法
  20. 【CAD】CAD入门知识

热门文章

  1. 程序时序图 Sequence Diagram(序列图) UML图(数据流程图)的绘制
  2. vscode运行虚拟环境virtualenv时报错:\Scripts\Activate.ps1,因为在此系统上禁止运行脚本
  3. 【哲学】为什么威尔·杜兰特在其所著的《哲学的故事》一书中说“所有科学源于哲学,终于艺术?”
  4. devcon的测试 尝试使用devcon命令重置Intel Realsense D435摄像头 USB
  5. python random.seed()函数 (生成固定随机数)random.seed(None)(取消固定随机数种子)
  6. Java中的与、或、非以及异或( | ~ ^)运算符的运算原理
  7. Divan and a Store 贪心(800)
  8. List集合、常用数据结构基本了解
  9. zip、gz压缩文件查看命令zless、less
  10. XML解析技术,DOM和SAX以及STAX的区别