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算法的关键是利用匹配失败后的信息,尽量减少模式串与主串 ...
随机推荐
- A*搜索
1,从点A开始,并且把它作为待处理点存入一个"开启列表".开启列表就像一张购物清单.尽管现在列表里只有一个元素,但以后就会多起来.你的路径可能会通过它包含的方格,也可能不会.基本上 ...
- 创建并追加img元素(jquery!)
有几种方法 但都需要你指定一个节点 根据这个节点进行添加 如现有一节点Id为pr:一,向该节点内部后方添加:1 $("#pr").append("<img src= ...
- android xml特殊字符
@ 对应 @ : 对应 : 对应 空格 对应 空格 ! 对应 ! " 对应 " # 对应 # $ 对应 $ % 对应 % & 对应 & ' 对应 ´ ( 对应 ...
- NMAP 基本用法
Nmap 用途: 1.通过对设备或者防火墙的探测来审计它的安全性. 2.探测目标主机所开放的端口. 3.网络存储,网络映射,维护和资产管理.(这个有待深入) 4.通过识别新的服务器审计网络的安全性. ...
- [问题]数据库MySQL和Navicat的乱码问题
计算机中存储字符需要使用编码集,早期有ASCII集,但是随着技术的发展,ASCII集不能满足需求,出现了越来越多的字符,比如中文字符等.后来又发展出了Unicode.GB2312.utf8等字符集.字 ...
- 构造 & 析构 & 匿名对象
以前仅知道创建对象,但对匿名对象的了解基本为0. 通过阅读google chromium源代码 中关于 log 的使用,查阅相关资料,了解了一下匿名对象,予以记录. 什么是匿名对象 匿名对象可以理 ...
- C#中的线程(一)入门
文章系参考转载,英文原文网址请参考:http://www.albahari.com/threading/ 作者 Joseph Albahari, 翻译 Swanky Wu 中文翻译作者把原文放在了& ...
- 【python】GTK 例子
# encoding:utf-8 # box_multi_button_data.py import pygtk, gtk def destroy(widget, data=None): gtk.ma ...
- 手机safari图片上传竖变横处理
在手机safari上传图片时,竖着的照片会变成横着的照片,以下程序片段利用图片exif信息把图片旋转回去,代码抄自php.net官网. http://php.net/manual/zh/functio ...
- 基于现有数据库的Code First模式迁移更新数据库
本文讨论的内容是基于EF4.1版本.文中谈论的现有的数据库不是由EF创建.本文假定你已经对Code First迁移有一定的了解,如果不了解Code First迁移更新数据库可以查看 文章涉及的主题如下 ...