浅析KMP算法
浅析KMP算法
KMP算法是一种线性字符串的匹配算法,将主串S与模式串T匹配。
首先朴素算法大家都会,就是直接从S的每一个位置开始,枚举比较,时间效率为O(nm),现在要想到一种化简的方式,使得时间复杂度得以减少,不考虑其他古怪的时间复杂度,那么必然要求是线性的。
观察串S=“aaaaab”,T=“aaab”,现在进行朴素的算法,看看有什么可化简的地方。
观察S匹配到第3位,T匹配到第3位的时候,发现下一位不能再匹配,此时说明S[1..3]=T[1..3],所以S[2..3]=T[2..3],有因为T[1..2]=T[2..3],所以S[2..3]=T[1..2],所以直接将T的第3位与S的第4位继续匹配。
以此类推……
归纳上述过程,就是通过模式串T本身的性质跳过某些与主串S匹配回合。令S[i]表示S的长度为i的前缀,next[i]为S[i]的前缀与S[i]的后缀的最长公共前缀的长度,某次匹配失败时,若模式串匹配至第j个字符,则可将模式串向右移next[i]位(next[i]个字符完全相同),若再不行,再移。当j=length(T)时,匹配成功,这种算法的复杂度被证明是O(n+m)
下面贴个代码:
//这个代码用来求有多少个位置满足匹配且分别是什么位置
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const int L=200;
char s[L],t[L];
int ls,lt,next[L],p[L];
int main(void)
{
scanf("%s%s",s,t);
ls=strlen(s);
lt=strlen(t);
next[0]=-1;
intj=-1;
for(int i=1;i<lt;i++)
{
while(j!=-1&&t[i]!=t[j+1]) j=next[j];
j+=t[i]==t[j+1];
next[i]=j;
}
j=-1;
for(int i=0;i<ls;i++)
{
while(j!=-1&&s[i]!=t[j+1]) j=next[j];
j+=s[i]==t[j+1];
if(j==lt-1)
{
p[++p[0]]=i-lt+1;
j=next[j];
}
}
for(int i=0;i<=p[0];i++) printf("%d\n",p[i]);
return 0;
}
小结本章内容,主要掌握KMP算法以及其算法思想。
浅析KMP算法的更多相关文章
- KMP算法浅析
具体参见: KMP算法详解 背景: KMP算法之所以叫做KMP算法是因为这个算法是由三个人共同提出来的,就取三个人名字的首字母作为该算法的名字.其实KMP算法与BF算法的区别就在于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. 少部分图片来自孤~影 ...
随机推荐
- ContentProvider官方教程(1)何时用content provider
Content Providers Content providers manage access to a structured set of data. They encapsulate the ...
- 个人对js闭包的理解
闭包算是前端面试的基础题,但我看了很多关于闭包的文章博客,但感觉很多对于闭包的理想还是有分歧的,现在网上对闭包的理解一般是两种: 有些文章认为闭包必须要返回嵌套函数中里面用到外面函数局部变量的方法 ...
- 4-JS对象
js中哪些是对象 除了字符串.数字.false.true.null和undefined之外,JavaScript中的值都是对象 原型(prototype) 每一个JavaScript对象(null除外 ...
- Java程序员必备的6款最佳开发工具
工欲善其事,必先利其器.每一个Java程序员都有其惯用的工具组件.对于Java程序员,各种有用的软件和工具泛滥成灾.初级开发人员要么找不到合适的工具,要么在寻找过程中浪费了大量的时间.下面,我将为大家 ...
- 编写Music类
package a; public class Instrument { public void play() { System.out.println("弹奏乐器"); } } ...
- 【Unity3D游戏开发】性能优化之缩减打包压缩包大小 (二八)
unity3d打包的所有文件是会被记录而且被排序的.所以这大大方便了我们分析为何打包文件如此之大,以及怎么减少打包文件. 日志目录一般在:C:\Users\Administrator\AppData\ ...
- PigSPS: a database for pig SNPs and signatures of positive selection
URL: http://www.ibiomedical.net/pigsps/ keywords: pig, boar, SNP, positive selection, database, db, ...
- 多命令顺序执行、管道符 ; && || |
多命令顺序执行:
- 使用ansible批量管理远程服务器
使用ansible批量管理远程服务器 背景 本地需要管理远程的一批服务器,主要执行以下任务: 1) 将本地的文件复制到远端所有服务器: 2) 需要在远程服务器中执行一个个命令: 远端服务器路径并非完全 ...
- ctDNA 相关网站-liquid-biopsy
http://www.gene-quantification.de/liquid-biopsy.html Liquid Biopsy -- Definitions Liquid Biopsy -- r ...