图解算法——KMP算法
KMP算法
解决的是包,含问题。
Str1中是否包含str2,如果包含,则返回子串开始位置。否则返回-1。
示例1:
Str1:abcd123def
Str2:123d
暴力法:
从str1的第一个字二哥符开始依此匹配,当以第一个字符开头的子串匹配不上时,开始从第二个字符开始。缺点:每一次匹配都是互相独立的。
复杂度为O(N*M),且N>=M。因为N<M就肯定不包含M长度的子串。

KMP算法将每一次的匹配进行了交涉。
此时,加入了字符串前后缀的概念。但要保证前后缀不能等于该字符串的长度。
以下分别以abcabcd和aaaaab字符串为例。

假设有这样的函数可以实现str2中每个位置的前面子串的最长前后缀。那么,
KMP算法的步骤就是:由原来的str1的i+1和str2的0匹配,改变为由str1的j和str2的0匹配,即由str1的x和str2的z匹配。如下图示:
举例说明:

过程图解:

加速实质解析: 否定了从str1中的i+1位置到j-1位置能配出str2的可能性。
进一步解析:
假设从str1中的i+1位置到j-1位置中有一个k位置开始匹配能配出str2。
那么就会存在在str1的k位置开始有一个后缀串和str2的前缀串相等。但是这又是和最长前后串的概念相违背的。故不成立。
再举一个把str2两次后推的例子(一次匹配不成功):

抽象出来就是:第一次匹配从str1的i开始和str2的0位置开始,匹配到最后到了甲指向的x位置和乙指向的Y位置,发现不匹配。则乙指向Y所对应的最长前后缀长度,即str2中位置指针乙回退到图示位置。下一步继续乙和甲(X)的下一个位置进行比较,这是为什么呢?因为两个画圈圈的部分是相等的,因为最长前后缀原理。

然后就是求解如何求得str2每个位置上的元素所对应的前面子串的最长前后缀位置。
原理如图:在0位置上设定为-1,1位置上设定为0,2位置上当0和1位置上相同时设定为1,否则设定为0。

然后利用数学归纳法:求i位置上的索引长度。假设i-1位置上索引长度是4,则看位置为4的下一位,也就是位置为5的位置上(前缀的下一个字符)和i-1位置上的字符是否相等,如果相等,则i位置上的索引长度就是i位置上索引长度+1,即4+1=5。


再举一例:

如果i-1位置上的索引长度4所对应的位置上的元素c和i-1位置上的元素t是否相等,如果相等,则i位置上的元素k所对应的索引长度就是i-1位置上的索引长度+1,即是5。如果不相等,则比较i-1位置上的索引长度4所对应的位置上的元素c的索引长度对应的元素a和i-1位置上的元素t是否相等,如果相等,则i位置上的元素k所对应的索引长度就是元素a所在位置上的索引长度+1,即是1+1=2,否则继续比较直至到该位置上对应的索引长度为0或者-1。类似于递归,也是数学归纳,不断往前看,往前寻找。

示例:
左侧是第一次比较c与t,第二次比较a与t都不对,a处已经对应的索引长度为0了,不能再继续向上寻找了,故i位置的k所对应的索引长度为0。
右图是第一次比较c与a,第二次比较a与a,匹配对了,此时c处对应的索引长度为2(ab),故i位置的k所对应的索引长度为2+1=3。

需要注意的是,永远和i-1位置上的元素去比较。直到比较相等,不相等就往前跳继续比较,直至到0。
代码如下:

实战题目:
题目:
树的包含。
就是在左树T1是否包含右树T2。
思路:将树序列化成字符串(字符数组),要把NULL也加入,否则单纯先序中序是不行的。然后利用KMP算法。

加入NULL的意义:

二题:
看一个串是否是范式得到的,如:abcabcabcabc,即是abc*n得到的。
该思路就是看每个字符的索引长度值是否是倍数关系。
Over......
图解算法——KMP算法的更多相关文章
- 数据结构与算法--KMP算法查找子字符串
数据结构与算法--KMP算法查找子字符串 部分内容和图片来自这三篇文章: 这篇文章.这篇文章.还有这篇他们写得非常棒.结合他们的解释和自己的理解,完成了本文. 上一节介绍了暴力法查找子字符串,同时也发 ...
- 经典算法 KMP算法详解
内容: 1.问题引入 2.暴力求解方法 3.优化方法 4.KMP算法 1.问题引入 原始问题: 对于一个字符串 str (长度为N)和另一个字符串 match (长度为M),如果 match 是 st ...
- 笔记-算法-KMP算法
笔记-算法-KMP算法 1. KMP算法 KMP算法是一种改进的字符串匹配算法,KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.具体实现就是实现一 ...
- 值得花费一周研究的算法 -- KMP算法(indexOf)
KMP算法是由三个科学家(kmp分别是他们名字的首字母)创造出来的一种字符串匹配算法. 所解决的问题: 求文本字符串text内寻找第一次出现字符串s的下标,若未出现返回-1. 例如 text : &q ...
- 程序员必会算法-KMP算法
KMP算法是一种优秀的字符串匹配算法,字符串匹配的常规算法是一步一步进行移位和比较操作,直至找到完全相匹配的字符串. 下面通过一个例子,为大家仔细说明KMP算法的使用和思路: 问题: 在字符串“DEA ...
- [C++] [算法] KMP算法
KMP串匹配算法是一个经典的算法. 传统BF算法是传统的字符串匹配算法.很好理解.叶实现.但时间复杂度太高. 本文将从字符串模式字符串被称为.为了匹配字符串被称为主弦. KMP配时能够少移动从串的位置 ...
- 算法 kmp算法
kmp算法是改进后的字符匹配算法,它与bf算法的区别是,每次从串与主串匹配失败后,从串与主串匹配的位置不同. 下面具体说下这两种算法的区别: 主串:BABCDABABCDABCED 从串:ABCDAB ...
- BF算法 + KMP算法
准备: 字符串比大小:比的就是字符串里每个字符的ASCII码的大小.(其实这样的比较没有多大的意义,我们关心的是字符串是否相等,即匹配等) 字符串的存储结构:同线性表(顺序存储+链式存储) 顺序存储结 ...
- 字符串匹配的 KMP算法
一般字符串匹配过程 KMP算法是字符串匹配算法的一种改进版,一般的字符串匹配算法是:从主串(目标字符串)和模式串(待匹配字符串)的第一个字符开始比较,如果相等则继续匹配下一个字符, 如果不相等则从主串 ...
随机推荐
- ORA-00054: 資源正被使用中, 請設定 NOWAIT 來取得它, 否則逾時到期
1.查看被使用资源的OBJECT_ID SELECT *FROM DBA_OBJECTS WHERE OBJECT_NAME='OBJECT_NAME' 2.查看资源被谁占用SELECT * FROM ...
- SAP 技术设置(technical setting)
在创建数据库表的时候,需要设置它的技术参数:这样才能使用. 在技术设置里,有个数据类(data class),如APPL0,等等. 有好多值可以供我们选择.这些值保存在表DDART中,表的描述:DD: ...
- springAOP的概述及使用
Spring AOP SpringAOP是Spring中非常重要的功能模块之一,该模块提供了面向切面编程,在事务处理,日志记录,安全控制等操作中广泛使用. SpringAOP的基本概念 AOP的概念 ...
- Java 迭代器的使用 Iterator
Java的集合类可以使用for ... each循环 List Set Queue Deque 我们以List为例 其实一个java编译器并不知道如何遍历一个List 编译器只是把一个for ... ...
- Py数据类型—整形与字符串
数据类型 在指针的右边输入.可以触发功能列表: 数字(整形):也就是123之类的,不能是abcd和中文之类的,数据类型为int 1.强制字符转换 a="123" b=int(a) ...
- CMOS 摄像头的Skipping 和 Binning 模式
在通常的摄像头中,不同的resolution对应不同的帧率.想要提高帧率就要考虑是否需要缩小视野(FOV).若不希望视野缩小,就需要减少resolution. 常用的减少resolution的两种方式 ...
- 从零开始学spring源码之xml解析(一):入门
谈到spring,首先想到的肯定是ioc,DI依赖注入,aop,但是其实很多人只是知道这些是spring核心概念,甚至不知道这些代表了什么意思,,作为一个java程序员,怎么能说自己对号称改变了jav ...
- 端口被占用通过域名的处理 把www.domain.com均衡到本机不同的端口 反向代理 隐藏端口 Nginx做非80端口转发 搭建nginx反向代理用做内网域名转发 location 规则
负载均衡-Nginx中文文档 http://www.nginx.cn/doc/example/loadbanlance.html 负载均衡 一个简单的负载均衡的示例,把www.domain.com均衡 ...
- P6739 [BalticOI 2014 Day1] Three Friends 题解
目录 写在前面 Solution 何为字符串哈希(可跳过): Code 写在前面 P6739 [BalticOI 2014 Day1] Three Friends 听说这题可以用比较暴力的做法过,比如 ...
- CF976B
这是一道考验思维找规律的题,很有可做性. 正文 题意 一个 n * m 的矩阵,从左上角(1 , 1) 开始,先向下走直到最下方,再向右走到最右,再向上走一个,再走到最左......一直走到(1 , ...