KMP 算法
KMP 是一个字符串匹配算法。之所以称之为KMP 是因为这个算法是由Knuth、Morris、Pratt三个提出来的。 这个算法能干什么呢 ? 我想到的有三个: 1. 告诉你一个串是否是另外一个串的子串; 2.一个串在另外一个串里面“重复”了多少次; 3. 可以告诉你一个串的所有前缀子串中是另外一个串的子串的最长前缀是什么。
首先对这三个功能做下说明:
第1个功能很容易理解,一个串是不是另外一个串的子串,例如 "aba" 是 "bababc" 的子串, 不是 "bacbaa" 的子串;
对于第2功能,我在重复上加了双引号是因为这个重复可以从两个意义上讲。举个例子, 模板串 ”AZAZAZA”, 匹配串 “AZA”。 第一种意义上的重复, 我们可以认为 匹配串 “AZA” 在 模板串 ”AZAZAZA” 中重复了两次:
”AZAZAZA”,”AZAZAZA”;
这种意义上的重复更符合我们通常意义上的重复。
第二种意义上的重复,我们可以认为匹配串 “AZA” 在 模板串 ”AZAZAZA” 中重复了三次:
”AZAZAZA”,”AZAZAZA”,”AZAZAZA”;
那么KMP 能计算那种意义上的重复次数呢? 幸运的是它都可以做到 ^_^。
第3个功能说的有点绕口(估计表达的有点问题),做下解释,一个字符串所有前缀就是以首字母开头的所有子串的集合。例如 ABA 的前缀包括 A, AB, ABA。KMP 算法能告诉我们匹配串的所有前缀中是模板串子串的最长前缀。照样举个例子:
匹配串“ABECA",模板串 "ECABEBAC"。
匹配串的前缀中 ”A", "AB", "ABE",三个子串都是 模板串的子串,但是 ”ABE“是最长的那个前缀串。
(ps.提到前缀,想起了后缀树,后缀树也可以用来查看一个串是不是另一个串的子串)
现在,我们先从最直观的想法来判断匹配串是不是模板串的子串讲起:
给定模板串 ”cdcdegcdf“, 匹配串 ”cdf“ 如下图:

第一次迭代,从下标1 开始匹配,第三次失败:

第二次迭代,从下标2开始匹配,第1次失败:

第三次迭代,从下标2开始匹配,第3次失败:

.......
.......
第七次迭代,从下标7开始,匹配成功:

从上面的迭代过程我们可以发现,在最坏的情况下,我们需要比较 (m*n) 次,才能得出结论。那么有没有更高效的算法呢? 当然,KMP 算法就是为了这个目的设计的。
KMP 算法的更多相关文章
- 简单有效的kmp算法
以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下“奥,它是做模式匹配的”这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(先不说 ...
- KMP算法
KMP算法是字符串模式匹配当中最经典的算法,原来大二学数据结构的有讲,但是当时只是记住了原理,但不知道代码实现,今天终于是完成了KMP的代码实现.原理KMP的原理其实很简单,给定一个字符串和一个模式串 ...
- 萌新笔记——用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)
前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成"* ...
- KMP算法实现
链接:http://blog.csdn.net/joylnwang/article/details/6778316 KMP算法是一种很经典的字符串匹配算法,链接中的讲解已经是很明确得了,自己按照其讲解 ...
- 数据结构与算法JavaScript (五) 串(经典KMP算法)
KMP算法和BM算法 KMP是前缀匹配和BM后缀匹配的经典算法,看得出来前缀匹配和后缀匹配的区别就仅仅在于比较的顺序不同 前缀匹配是指:模式串和母串的比较从左到右,模式串的移动也是从 左到右 后缀匹配 ...
- 扩展KMP算法
一 问题定义 给定母串S和子串T,定义n为母串S的长度,m为子串T的长度,suffix[i]为第i个字符开始的母串S的后缀子串,extend[i]为suffix[i]与字串T的最长公共前缀长度.求出所 ...
- 字符串模式匹配之KMP算法图解与 next 数组原理和实现方案
之前说到,朴素的匹配,每趟比较,都要回溯主串的指针,费事.则 KMP 就是对朴素匹配的一种改进.正好复习一下. KMP 算法其改进思想在于: 每当一趟匹配过程中出现字符比较不相等时,不需要回溯主串的 ...
- 算法:KMP算法
算法:KMP排序 算法分析 KMP算法是一种快速的模式匹配算法.KMP是三位大师:D.E.Knuth.J.H.Morris和V.R.Pratt同时发现的,所以取首字母组成KMP. 少部分图片来自孤~影 ...
- BF算法与KMP算法
BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相等,则比较S的 ...
- KMP算法-next函数求解
KMP函数求解:一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为KMP算法.KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串 ...
随机推荐
- MSSQLSERVER服务无法启动的解决方案
MSSQLSERVER服务无法启动的解决方案 有时候sqlserver无法启动了,原因是mssqlserver服务没有启动,当你手动启动时,又出现服务无法响应的可恶错误提示... 笔者“有幸”遇到了, ...
- SVM学习笔记(一):libsvm参数说明(转)
LIBSVM 数据格式需要---------------------- 决策属性 条件属性a 条件属性b ... 2 1:7 2:5 ... 1 1:4 2:2 ... 数据格式转换--------- ...
- Java浮点数float,bigdecimal和double精确计算的精度误差问题总结
(转)Java浮点数float,bigdecimal和double精确计算的精度误差问题总结 1.float整数计算误差 案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结 ...
- iphone中button按钮显示为圆形解决
iphone中button按钮显示为圆形解决: 添加样式: -webkit-appearance:button; 如果需要为直角: border-radius:0 在源码中添加如:style=&quo ...
- notepad++ 配置Python 调试环境 实用版
一. 安装python 1. 下载python 2.7版本并安装: 2. 在安装到自定义python的时候选择 add python to ptah项:
- android基于GPS实现定位操作
一.定位的三种方式 1.wifi定位,ip地址定位,通过ip地址进行查询实际地址: 2.基站定位,信号塔,基站:手机通讯服务的设备 ,信号的格数决定了手机距离基站远近,精确度:几十米到几公里,精确度来 ...
- Javascript 截取2位小数
今天在处理数据时,前台界面金额需要保留两位小数,所以只能使用Javascript 来进行截取. var regex = /([0-9]+\.[0-9]{2})[0-9]*/; var localMon ...
- 在网页程序或Java程序中调用接口实现短信猫收发短信的解决方案
方案特点: 在网页程序或Java程序中调用接口实现短信猫收发短信的解决方案,简化软件开发流程,减少各应用系统相同模块的重复开发工作,提高系统稳定性和可靠性. 基于HTTP协议的开发接口 使用特点在网页 ...
- iOS开发-automaticallyAdjustsScrollViewInsets属性
iOS开发-automaticallyAdjustsScrollViewInsets属性 Available in iOS 7.0 and later. 简单点说就是automaticallyAdju ...
- mouseover、mouseout,mouseenter、mouseleave区别
心情压抑的一天,我想好好的. mouseover与mouseenter 不论鼠标指针穿过被选元素或其子元素,都会触发 mouseover 事件. 只有在鼠标指针穿过被选元素时,才会触发 mouseen ...