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算法的关键是利用匹配失败后的信息,尽量减少模式串与主串 ...
随机推荐
- yii2 pjax使用
Pjax::begin(['id'=>'datalist']); echo GridView::widget([ 'dataProvider' => $dataProvider, 'col ...
- kafka java实例
生产者 package com; import java.util.Properties; import java.util.concurrent.TimeUnit; import kafka.jav ...
- SQLServer idenity 字段跳值
修改数据库实例的启动参数 然后修改SQLServer启动参数,打开SQLServer configuration manager,然后选择服务实例,点击右键属性,查看实例的属性界面,然后启动参数选项输 ...
- 韩服LOL
※◆☆★☆◆※欢迎使用韩服LOL辅助,如有疑问请联系作者QQ:82850696*2*测试版已停用*1*2014-8-27 14:05:59*哈密*E2873D0137C6D04F42E088AA46E ...
- LINQ - 在Where條件式中使用in與not in
希望对大家在以后的项目中能用到,我也是在项目中碰到了这个问题: 算算時間,接觸LINQ也有一個月的時間了,可以算是落伍兼新生,不過最近在寫專案的時候,遇到了在LINQ的Where條件式中要如何使用in ...
- LinuxMM--MemoryHierarchy
MemoryHierarchy 为了理解内核中的页替换算法,有必要认识linux中的存储体系分层架构.访问模式以及混合工作mixed workloads. 存储器分层架构 有两种类型的存储分层架构 ...
- html5新特性之拖放
1.元素是否可拖动可放置 draggable="true" 设置元素可以拖动 ondragover="allowDrop(event)" 元素默认不能放置,加 ...
- 给自己立下一个巨大的flag
[BZOJ1861][BZOJ3224] [BZOJ2733][BZOJ1056] [BZOJ2120][BZOJ3673] [BZOJ1833][BZOJ1026] [BZOJ3209][BZOJ1 ...
- 【转】简易smtp调用类
用PHP发邮件的一个类,无需验证SMTP主机,类代码你可以不用管,只要按照后面的使用方法操作就行,这个类要先保存成一个php文件,文件名就叫smtp.php吧,下面是该文件代码: <?php c ...
- EasyUI detailview 使用心得
view: detailview, detailFormatter: function (rowIndex, rowData) { return "<div class='easyui ...