KMP算法之 好理解的模板
主要作用:能够在线性复杂度内求出一个串在另一个串的所有匹配位置。
说明:设模板串是 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算法之 好理解的模板相关推荐
- 我关于KMP算法的初步理解
唔,时间过得好快,下学期都过了一半了,因为寒假玩去了,数据结构也没学完.后来看到KMP算法的时候,第一次一晚上就想一个问题,当然,总算是有些眉目了,下面是我对KMP算法的一些理解,当然还没有看完,但是 ...
- KMP算法的简单理解
引入 对于串的匹配,较为简单的有BF算法,但这种方法的可用性却较差.因为在每次不匹配的时候,主串(m位)和子串(n位)都会回溯,有一种最坏的情况就是,主串每前进一位,都在n次匹配后失败然后回溯,如: ...
- KMP算法最浅显理解——一看就明白
说明 KMP算法看懂了觉得特别简单,思路很简单,看不懂之前,查各种资料,看的稀里糊涂,即使网上最简单的解释,依然看的稀里糊涂. 我花了半天时间,争取用最短的篇幅大致搞明白这玩意到底是啥. 这里不扯概念 ...
- KMP算法详解P3375 【模板】KMP字符串匹配题解
KMP算法详解: KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt(雾)提出的. 对于字符串匹配问题(such as 问你在abababb中有多少个 ...
- 深化对KMP算法的理解
KMP算法 看到这么一句话:你的名字是我告白语中的子串 文章目录 KMP算法 参考代码 预处理模式串的理解 入门题目 KMP一开始理解起来是比较困难的,下方是结合自己的理解写出来代码,仅作参考, (网 ...
- BF算法优化-------KMP算法
百度百科:KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的核心是利用 ...
- [算法系列之二十六]字符串匹配之KMP算法
一 简介 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法).KMP算法的关键是利 ...
- 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 ...
- KMP算法——很详细的讲解
前段时间学习KMP算法,感觉有些复杂,不过好歹是弄懂啦,简单地记录一下,方便以后自己回忆. 引入 首先我们来看一个例子,现在有两个字符串A和B,问你在A中是否有B,有几个?为了方便叙述,我们先给定两个 ...
最新文章
- 100万年薪只是起步价!跨境AI人才遭疯抢后最终去了哪儿?
- python列表(list)中出现次数最多的元素使用collection包的Counter方法
- Win10 Terminal + WSL 2 安装配置指南,精致开发体验 - 知乎 (zhihu.com)
- 机械爪角度与距离之间的关系
- UE4学习-虚幻4帮助手册、通过蓝图实现动画效果、添加时间轴、添加声音、C++和蓝图事件关联
- html动画转换为桌面动态壁纸,动态桌面:把精彩的flash动画设为桌面
- windows下gvim中文乱码解决方案
- u-boot向linux内核传递启动参数
- android设置成默认应用程序,在Android中设置和取消设置默认应用
- Android Intent组件使用
- Windows防火墙添加80端口,解决apache无法访问的问题
- android shape 绘制气泡图,气泡图-自定义 shape
- kafka--Struct Streaming--mysql案例
- 微信小程序如何获取token
- 高德地图 js自动定位到当前城市
- 初探Java设计模式4:JDK中的设计模式
- 关于智能运维(AIOps)的学与思
- 转行做软件编程开发的经历
- PostgreSQL t_bits计算方法
- 【CAD】CAD入门知识
热门文章
- 程序时序图 Sequence Diagram(序列图) UML图(数据流程图)的绘制
- vscode运行虚拟环境virtualenv时报错:\Scripts\Activate.ps1,因为在此系统上禁止运行脚本
- 【哲学】为什么威尔·杜兰特在其所著的《哲学的故事》一书中说“所有科学源于哲学,终于艺术?”
- devcon的测试 尝试使用devcon命令重置Intel Realsense D435摄像头 USB
- python random.seed()函数 (生成固定随机数)random.seed(None)(取消固定随机数种子)
- Java中的与、或、非以及异或( | ~ ^)运算符的运算原理
- Divan and a Store 贪心(800)
- List集合、常用数据结构基本了解
- zip、gz压缩文件查看命令zless、less
- XML解析技术,DOM和SAX以及STAX的区别