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 算法的更多相关文章

  1. 简单有效的kmp算法

    以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下“奥,它是做模式匹配的”这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(先不说 ...

  2. KMP算法

    KMP算法是字符串模式匹配当中最经典的算法,原来大二学数据结构的有讲,但是当时只是记住了原理,但不知道代码实现,今天终于是完成了KMP的代码实现.原理KMP的原理其实很简单,给定一个字符串和一个模式串 ...

  3. 萌新笔记——用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)

    前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成"* ...

  4. KMP算法实现

    链接:http://blog.csdn.net/joylnwang/article/details/6778316 KMP算法是一种很经典的字符串匹配算法,链接中的讲解已经是很明确得了,自己按照其讲解 ...

  5. 数据结构与算法JavaScript (五) 串(经典KMP算法)

    KMP算法和BM算法 KMP是前缀匹配和BM后缀匹配的经典算法,看得出来前缀匹配和后缀匹配的区别就仅仅在于比较的顺序不同 前缀匹配是指:模式串和母串的比较从左到右,模式串的移动也是从 左到右 后缀匹配 ...

  6. 扩展KMP算法

    一 问题定义 给定母串S和子串T,定义n为母串S的长度,m为子串T的长度,suffix[i]为第i个字符开始的母串S的后缀子串,extend[i]为suffix[i]与字串T的最长公共前缀长度.求出所 ...

  7. 字符串模式匹配之KMP算法图解与 next 数组原理和实现方案

    之前说到,朴素的匹配,每趟比较,都要回溯主串的指针,费事.则 KMP 就是对朴素匹配的一种改进.正好复习一下. KMP 算法其改进思想在于: 每当一趟匹配过程中出现字符比较不相等时,不需要回溯主串的 ...

  8. 算法:KMP算法

    算法:KMP排序 算法分析 KMP算法是一种快速的模式匹配算法.KMP是三位大师:D.E.Knuth.J.H.Morris和V.R.Pratt同时发现的,所以取首字母组成KMP. 少部分图片来自孤~影 ...

  9. BF算法与KMP算法

    BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相等,则比较S的 ...

  10. KMP算法-next函数求解

    KMP函数求解:一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为KMP算法.KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串 ...

随机推荐

  1. Android开发学习---使用XmlPullParser解析xml文件

    Android中解析XML的方式主要有三种:sax,dom和pull关于其内容可参考:http://blog.csdn.net/liuhe688/article/details/6415593 本文将 ...

  2. 使用jekyll在GitHub Pages上搭建个人博客【转】

    网上有不少资源,但大多是“授人以鱼”,文中一步一步的告诉你怎么做,却没有解释为什么,以及他是如何知道的.他们默认着你知道种种专业名词的含义,默认着你掌握着特定技能.你折腾半天,查资料,看教程,一步步下 ...

  3. CSS浏览器兼容问题总结

    为什么会出现浏览器兼容问题? 由于各大主流浏览器是不同的厂家开发的,所以使用的核心也不相同,架构代码很难重合,就会产生各种各样的bug. IE6中常见的css解析bug 1)默认高度(IE6)部分块元 ...

  4. 日期对象-Date

    新建日期对象  var date = new Date(); getTime()         从 1970年 1月 1日开始计算到 Date 对象中的时间之间的毫秒数. getFullYear() ...

  5. ue4 FPaths各目录

    GetWrappedLaunchDir() 启动时的工作目录,因为马上要把工作目录改为下面所说的exe所在目录,所以会先把当前的缓存起来 FPlatformProcess::BaseDir() 这个是 ...

  6. touchstart,touchmove判断手机中滑屏方向

    滑动屏幕    touchstart:接触屏幕时触发,touchmove:活动过程触发,touchend:离开屏幕时触发 首先获取手接触屏幕时的坐标X,Y //获取接触屏幕时的X和Y$('body') ...

  7. myeclipse性能优化

    1. 取消启动项.这个设置立竿见影.Window->Preferences->General->Startup and Shutdown, Plug-ins activated on ...

  8. Vue组件之自定义表单组件

    今天又看了一遍vue的文档,记得之前学习的时候,官方文档中有提过,v-model指令是一个语法糖,做两件事,一个是给表单控件元素绑定value,第二个是当输入时更新绑定的值,不过后来在"表单 ...

  9. R与Java

    对于从未接触代码的我,看到这些很陌生,现在需要做的是用r语言去做数据处理分析,将分析的结果给Java,然后在Java上输出想要的结果,没人给予指导,自己就这样瞎摸索,真希望有这方面的牛人给予指导,让一 ...

  10. Hibernate+jsp+struts+spring做增删该查,

    同样还是web项目,这里只做了一张表,做一个测试,例子.主要是建Hibernate 的时候要非常注意,有时间了整理一下建Hiberbnate 的时候需要注意的事项 这里我是建了5个包,其实只要四个就好 ...