| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 【数据结构】KMP算法详解 -> 正文阅读 |
|
[数据结构与算法]【数据结构】KMP算法详解 |
有这样一个问题: 1 两种字符串匹配思路1.1 暴力思路想象两把尺子,S是上面的长尺,P是下面的短尺,最开始两个尺子左端对齐,下面的短尺从左到右一位一位移动,直到匹配成功。 1.2 KMP思路Knuth、Morris、Pratt三个学者提出这样一种方法:就这个例子而言,当 D 对应的是空格时,我们并没有前功尽弃,因为我们已知 D 前面的 ABCDAB 是已经正确匹配的,同时我们发现正确匹配的字符串前后两端都有 AB(ABCDAB),那么我们可以直接向后移动 4 位,继续去匹配空格,观察能否匹配成功,即:
如果空格匹配成功则继续,匹配失败的话可以再观察是否有类似“回文”1的形式,如果有的话可以一次移动多位,如果没有只能一位一位移了。(实际上还剩下的AB已经不具备跳着移动的条件了,如果仍然无法匹配,只能全部移过去从头开始了) 我们再给一个例子来感受KMP:
如果是暴力的话,第一次匹配不到e,可能就是这样的结果:(一位一位移动看是否能匹配)
2 概念补充2.1 模式串和模板串s[ ]是模式串,即比较长的字符串。 2.2 前缀后缀“非平凡前缀”:指除了最后一个字符以外,一个字符串的全部头部组合。 举例:P =
2.3 next数组在上面的例子中,我们每一次应该向右直接移动多少位是通过next数组得到的,而next数组是经过预处理得到的。
还是刚刚那个:P =
eg.对5来说,next[5] = 2的含义就是:p[1 ~ 2] = p[4 ~ 5] 3 代码实现3.1 next数组的应用有了next数组,我们每次匹配不成功时,就可以直接得出下一个跳向哪个位置,这一操作可以直接由
贴一张y总上课讲的抽象图:(配合上面代码) 3.2 next数组的初始化先给一个例子,便于下面算法的模拟,顺便看看对next数组是否理解了:
next数组的初始化的本质就是自己和自己匹配。
代码写出来和3.1几乎一样,毕竟都是匹配的过程。
3.3 总代码题目链接:KMP匹配字符串
4 参考 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 22:25:08- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |