KMP模板与讲解

 

读书笔记终于写完了,写一下我对KMP的理解。

KMP的思想就是尽量利用已经得到的信息,来降低时间复杂度,已经得到的信息存放在next数组里。算法确实很难理解,所以很难讲解。。举个例子来说吧。

设字符串是str[],next[5] = 2。

就表示str[5]前面的2个字符,与str[2]前面的2个字符相同,也就是str[0] == str[3], str[1] == str[4],这样把str[2]平移到str[5]的位置以后,就能保证前面的已经匹配了。就是下图:

目标串    ..........a  b  c.........

str[]   a  b  c  a  b  d  e  f

下标    0  1  2  3  4  5  6  7

这时候在下标为5的位置,d和c是不匹配的,因为next[5] = 2,所以把下标为2的c平移到下标为5的位置,再次比较。

目标串    ..........a  b  c.........

            str[]              a  b  c  a  b  d  e  f

下标    0  1  2  3  4  5  6  7

当下标超出待匹配的字符串的长度时,就说明在目标串中找到了该字串。

这里还有一个定理:next数组中的值就是"前缀"和"后缀"的最长的共有元素的长度。

还有一句“名言”:假如你要向你喜欢的人表白的话,我的名字是你的告白语中的子串吗?

最后是几篇比较好的讲解KMP的文章,讲解方式各不相同,但是都讲得特别好。

http://www.matrix67.com/blog/archives/115

http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html

http://blog.csdn.net/v_july_v/article/details/7041827

 1 void kmp(char target[], char source[])
 2 {
 3     int n = strlen(target);
 4     int m = strlen(source);
 5     int *next = new int[m];
 6     int j = -1;
 7     next[0] = -1;
 8     for(int i = 1; i < m; i++)
 9     {
10         while(j >= 0 && source[j+1] != source[i])
11             j = next[j];
12         if(source[j+1] == source[i])
13             j++;
14         next[i] = j;
15     }
16     j = -1;
17     for(int i = 0; i < n; i++)
18     {
19         while(j >= 0 && source[j+1] != target[i])
20             j = next[j];
21         if(source[j+1] == target[i])
22             j++;
23         if(j >= m-1)
24         {
25             printf("%d\n", i-m+1);
26             j = next[j]; //继续查找更多
27             //return;   //不再继续查找
28         }
29     }
30 }
View Code

 

转载于:https://www.cnblogs.com/wolfred7464/p/3414993.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259193.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 非root app 捕捉系统广播_APP的生死之道

这篇文章主要介绍APP在安卓系统中是怎么被杀死的&#xff0c;按照怎样的一个策略去释放进程&#xff1b;同时介绍一些延长应用存活时间的方案&#xff0c;虽然这个在现在安卓系统上越来越难实现了&#xff0c;但是也是可以稍微了解下&#xff0c;主要也是通过这些hack的方案更好…

C++11系列学习之六-----for

前言C11这次的更新带来了令很多C程序员期待已久的for range循环&#xff0c;每次看到javascript&#xff0c; lua里的for range&#xff0c;心想要是C能有多好&#xff0c;心里别提多酸了。这次C11不负众望&#xff0c;再也不用羡慕别家人的for range了。使用场景ex1&#xff1…

ArcGIS Engine 10开发环境的一些常见问题(转载)

转自&#xff1a;http://bbs.esrichina-bj.cn/ESRI/viewthread.php?tid107612&extra&page1 许多版友在刚刚使用ArcGIS 10做开发的时候&#xff0c;都会遇到这样那样的问题。在担任实习版主的这一个多月里&#xff0c;看到了这么几个与开发环境相关的问题&#xff0c;重…

@value 静态变量_面试官:为什么静态方法不能调用非静态方法和变量?

这个可能很多人之前学习jvm的时候都会遇到&#xff0c;属于一个小问题&#xff0c;写这篇文章的原因是我在看java相关的面试题目中遇到的&#xff0c;因此顺手总结一下&#xff1a;一、例子我们先看效果&#xff1a;我们在静态方法main中调用非静态变量或者是方法都会报错。我们…

SpringMVC连接多数据源配置

在spring-config-datasource.xml中配置&#xff1a; <ds:ibatis-config><ds:sql-map-clientid"sqlMapClient2"datasource-ref"riskBasicDataSource2"config-location"classpath:sqlmap-config.xml"/> </ds:ibatis-config> <…

Memcached 工作原理

http://hzp.iteye.com/blog/1872664Memcached处理的原子是每一个&#xff08;key&#xff0c;value&#xff09;对&#xff08;以下简称kv对&#xff09;&#xff0c;key会通过一个hash算法转化成hash-key&#xff0c;便于查找、对比以及做到尽可能的散列。同时&#xff0c;mem…

C++11系列学习之七---------初始化列表

一、前言C的学习中&#xff0c;我想每个人都被变量定义和申明折磨过&#xff0c;比如我在大学笔试过的几家公司&#xff0c;都考察了const和变量&#xff0c;类型的不同排列组合&#xff0c;让你区别有啥不同。反正在学习C过程中已经被折磨惯了&#xff0c;今天再来看看重温下那…

c# streamReader转XmlDocument读取节点

http获得web&#xff08;url&#xff09;请求&#xff0c;先是获得数据流streamreader&#xff0c;之后将String数据流转换为xmldocument&#xff0c;之后xmlnode读取节点。 // get the responseWebResponse webResponse webRequest.GetResponse();if (webResponse null){ re…

ad中电容用什么封装_用什么来降低噪声?只要几个电容器就可以,简单有效!...

使用电容器降低噪声噪声分很多种&#xff0c;性质也是多种多样的。所以&#xff0c;噪声对策(即降低噪声的方法)也多种多样。在这里主要谈开关电源相关的噪声&#xff0c;因此&#xff0c;请理解为DC电压中电压电平较低、频率较高的噪声。另外&#xff0c;除电容外&#xff0c;…

C#委托的介绍(delegate、Action、Func、predicate)

委托是一个类&#xff0c;它定义了方法的类型&#xff0c;使得可以将方法当作另一个方法的参数来进行传递。事件是一种特殊的委托。 1.委托的声明 (1). delegate delegate我们常用到的一种声明 Delegate至少0个参数&#xff0c;至多32个参数&#xff0c;可以无返回值&#xff0…

版本1.8.1Go安装以及语法高亮配置

注意点&#xff1a;普通用户和root用户高亮要设置两遍①下载go安装包 https://golang.org/doc/ 最新的版本&#xff1a;go1.8.1.linux-amd64.tar.gz ②进入主目录&#xff1a;$:su ~赋给普通用户root权限&#xff0c;以便执行tar命令&#xff1a;$:su root 把压缩包解压到/usr/…

求二叉树中节点的最大距离

struct node{ Node Left; Node Right; int MaxLeft;//左子树到该节点的最长距离 int MaxRight;//右子树到该节点的最长距离 char chValue; }; void FindMaxLen(Node T) { int tmpMax 0; if (NULL T) { return; } if (NULL T->Left) { T->MaxLeft 0; } if (NULL T-&g…

flutter 自定义键盘_入门级机械键盘选购对比

个人觉得键盘这种东西&#xff0c;手感是最重要的&#xff0c;毕竟键盘是要拿用的&#xff0c;不是拿来供的。不管键盘再怎么好看、酷炫&#xff0c;只要你用起来不舒服、不习惯&#xff0c;那对你而言&#xff0c;就不会是一把好键盘。那么&#xff0c;影响手感的因素主要有哪…

腾讯2016校招试题----------格雷码的实现

问题&#xff1a;产生n位元的所有格雷码。格雷码(Gray Code)是一个数列集合&#xff0c;每个数使用二进位来表示&#xff0c;假设使用n位元来表示每个数字&#xff0c;任两个数之间只有一个位元值不同。例如以下为3位元的格雷码&#xff1a; 000 001 011 010 110 111 101 100 。…

关于A/D方面的小结

&#xff08;转载&#xff09;AD精度与分辨率 最近做了一块板子&#xff0c;当然考虑到元器件的选型了&#xff0c;由于指标中要求精度比较高&#xff0c;所以对于AD的选型很慎重。 很多人对于精度和分辨率的概念不清楚&#xff0c;这里我做一下总结&#xff0c;希望大家不要…

常用表的字段

F:\study\表的设计 一&#xff1a;网站设置有哪些内容&#xff1a; 1>title 表题 2>logo 3>keyword 关键字 4>status 是否开启 5>Internet 备案号 6>url 网址 7>tel 联系电话 8>brief …

四个好看的CSS样式表格

1. 单像素边框CSS表格 这是一个非经常常使用的表格样式。 源码&#xff1a; <!-- CSS goes in the document HEAD or added to your external stylesheet --> <style type"text/css"> table.gridtable { font-family: verdana,arial,sans-serif; font-si…

C# COM ArcgisEngine 多线程相关

这段时间做ArcgisEngine&#xff0c;因为在做图形交叉分析时&#xff0c;计算数据分多个线程分别计算不同的图形&#xff0c;发现计算错误。后来初步了接了是由于所有的ArcObjects组件都被标记为单线程单元&#xff08;STA参考VS帮助文档&#xff09;。每个STA都限制在一个线程…

loading initial ramdisk 卡住_驿站晨读 | 一城市多家快递“卡住了”!有快递网点直接建议:换别家吧......

编辑&#xff1a;驿站老鬼 主播&#xff1a;若晨‍▎美团回应“外卖小哥致电取餐被打成颅脑损伤”10月15日晚&#xff0c;成都温江区某小区内发生一起顾客殴打外卖员事件&#xff0c;导致外卖员冯某东轻度颅脑损伤以及右膝外侧半月板撕裂。据了解&#xff0c;事件起因是顾客要…

CVTE2016校招试题摘选

今年的题分两部分&#xff0c;时间为晚上7:00-9:30,题目分不定项选择与两道编程题。 下面是我自己抄下来的一部分题&#xff0c;尽飨读者。 1.堆排序属于下面哪种排序方法&#xff1f; A、选择排序 B、插入排序、C、交换排序 D、归并排序 答案&#xff1a; A 2. 用RSA算法…