首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

字符串匹配:KMP算法

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth与J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特—莫里斯—普拉特算法。...KMP算法主要分为两个步骤:字符串的自我匹配,目标串和模式串之间的匹配。 ? KMP.jpg (一)字符串的自我匹配 所谓字符串的自我匹配,就是看字符串中左右侧相等的最长子串的字符个数。...,是否和selfMatch函数的中的算法神似呢?...假如复杂度是mn的话,那么这个KMP算法相对于BF算法就谈不上改进了。 分析一下这个while循环,实际上它的作用就是让j不断变小,导致p串不断右移。...显然,在i=0到i=n-1的整个比较过程中,j最多只能往右挪移n次,所以while循环的平均复杂度最多为1,所以KMP算法是线性的,复杂度是n,而不是mn。这就是KMP算法存在的价值。

2.4K100

KMP 字符串匹配算法

KMP(Knuth-Morris-Pratt) 算法是一种常见的字符串匹配算法,在主字符串 S 中查找字符串 M 出现的起始位置,通过 M 的自身信息来减少无效的查询次数。...KMP算法 在了解KMP算法之前,首先看两个貌似无关的概念:前缀和后缀。前缀是指除最后一个字符或多个字符的字符串组合,后缀是指除第一个字符或多个字符的字符串组合。...由概念可知,对于字符串 T,若其前缀和后缀的最长重复字符串为 PM,则 PM 完全匹配 T 的开头 len(PM) 个字符串,且完全匹配 T 的结尾 len(PM) 个字符串。...KMP算法中查找 M 在 S 中位置,在匹配过程中,通过分析 M 与 S 的已匹配字符串信息来避免回退现象,过程如下: 从 S 的第一个字符开始进行逐个扫描对比: ?...KMP 算法保证了 i 指向的 S 中位置不需要进行回退,可以减少无效的回退造成的性能浪费。

1.8K30
您找到你想要的搜索结果了吗?
是的
没有找到

字符串匹配算法KMP

KMP由来 上一节说的BM算法是最高效、最常用的字符串匹配算法。...最知名的却是KMP,它3位作者(D.E.Knuth,J.H.Morris,V.R.Pratt),算法的全称是Knuth Morris Pratt 算法,简称KMP算法。 2....KMP算法基本原理 类似于BM里的概念:坏字符(不能匹配的),好前缀(已经匹配的那段) ? ? KMP算法目的:当遇到坏字符后,对于已经对比过的好前缀,将模式串多滑动几位 ?...如果next [j] = k,代表 j 之前的字符串中有最大长度为 k 的相同前缀后缀子串。 失效函数计算方法 方法1:暴力求解子串长度,效率低 ?...代码 王争的代码不好理解,找了书和别的人的代码参考 /** * @description: KMP字符串匹配算法 * @author: michael ming * @date: 2019/6/22

72010

KMP字符串匹配算法

KMP算法,Knuth-Morris-Pratt Algorithm,一种由Knuth(D.E.Knuth)、Morris(J.H.Morris)和Pratt(V.R.Pratt)三人提出的一种快速模式匹配算法...算法的演变 我们由上面KMP朴素算法的例子来引出一个问题。...KMP算法 KMP算法,是由KMP朴素算法演变而来的,主要分为两步: 第一步,当字符串比较出现不等时,确定下一趟比较前,应该将子串pattern右移多少个字符(预处理) 第二步,子串pattern右移后...总结: 第一步,其实就是KMP朴素算法对模式匹配子串pattern的预处理过程,上面已经给出了算法公式和代码示例 第二步,本质上就是KMP朴素算法,不同的仅仅是pattern右移的位数大小由其预处理过程决定...KMP算法不太容易理解,但其简洁、高效,时间复杂度为O(m+n) 其中,O(m)是pattern子串预处理的时间复杂度,O(n)是target目标串查找的时间复杂度,总时间复杂度为O(m+n) KMP

1.5K10

算法 | KMP字符串匹配

字符串是不可变数据类型,也就是说你要改变原字符串内的元素,只能是新建另一个字符串字符串匹配就是基于最简单的字符比较,其中的模式串就是普通字符串,所做匹配是在目标串里查找等于模式串的子串。...也就是说,比较的一方是表示模式的字符串,另一方是目标字符串的所有可能子串。我们常用的就是朴素的串匹配算法和无回溯串匹配算法KMP算法)。 2....(KMP算法) 在状态(0)匹配到第一个c失败时,由于已知前两个字符不同,KMP算法直接把模式串移两个位置,模式串开头的a移到c匹配失败的位置,达到状态(1)。...KMP算法直接把模式串的b移到刚才匹配c失败的位置(前面字符a肯定匹配,不必再试),达到状态(2)。接下去从模式串的b继续匹配,找到了一个成功匹配。...下面是无回溯匹配算法的一个实现: def kmp_matcher(T, P): T = ' ' + T P = ' ' + Pn = len(T) – 1 m = len(P) – 1

1.1K20

字符串匹配算法:BF & KMP

字符串匹配算法:BF & KMP 1. BF算法 2. KMP算法 2.0 引出next数组 总结: 1..../*字符串匹配算法 BF str:主串 sub:子串 返回值:返回子串在主串当中的下标。...KMP算法 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。...KMP算法的时间复杂度O(m+n) [1] 。 区别:KMP 和 BF 唯一不一样的地方在,我主串的 i 并不会回退,并且 j 也不会移动到 0 号位置。...d\n", KMP("ababcabcdabcde", "ab", 0));//0 } 总结: KMP算法只需要在BF算法基础之上改变j的回退步数,并且i不回退,而j的步数则由其对应的next数组的每一个元素存储

43500

字符串匹配的KMP算法

关于字符串匹配KMP算法其实不难,只要理解字符串下一步匹配需要移动的个数就可以了,但是说是这么说,实际理解肯定会有或多或少的问题,要是大家看完之后还是有问题有疑问的同学,可以再文章底部加我~ 字符串匹配的...KMP算法 字符串匹配是计算机的基本任务之一。...许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth。 ?...这种算法不太容易理解,网上有很多解释,但读起来都很费劲。直到读到Jake Boxer的文章,我才真正理解这种算法。下面,我用自己的语言,试图写一篇比较好懂的KMP算法解释。 1. ?...KMP算法的想法是,设法利用这个已知信息,不要把"搜索位置"移回已经比较过的位置,继续把它向后移,这样就提高了效率。 8. ? 怎么做到这一点呢?

1.5K40

字符串匹配的KMP算法

字符串匹配是计算机的基本任务之一。 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?...许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth。...这种算法不太容易理解,网上有很多解释,但读起来都很费劲。直到读到Jake Boxer的文章,我才真正理解这种算法。下面,我用自己的语言,试图写一篇比较好懂的KMP算法解释。 1....就这样,直到字符串有一个字符,与搜索词的第一个字符相同为止。 4. 接着比较字符串和搜索词的下一个字符,还是相同。 5. 直到字符串有一个字符,与搜索词对应的字符不相同为止。 6....KMP算法的想法是,设法利用这个已知信息,不要把"搜索位置"移回已经比较过的位置,继续把它向后移,这样就提高了效率。 8. 怎么做到这一点呢?

1.4K60

KMP算法(字符串匹配问题)

注意,是KMP算法,不是MMP哈,我没有骂人。KMP算法是用来做字符串匹配的,除了KMP算法分,还有暴力匹配算法,也是用来做字符串匹配的。接下来先看看暴力匹配算法,你就知道为啥会出现KMP算法了。...算法思路: 假如现有两个字符串: String str1 = "BBC ABCDAB ABCDABCDABDE"; String str2 = "ABCDABD"; 假设现在str1匹配到i位置,str2...介绍: KMP算法,是一个判断字符串是否在另一个字符串中出现过的算法,如果出现过,返回最早出现的位置。...和暴力匹配算法不同的是,KMP算法会用一个next数组来保存字符串中前后最长公共子序列的长度,每次回溯时,通过next找到前面匹配过的位置,这样就省了大量的时间。 2....KMP算法使用步骤: 首先得到匹配串的部分匹配表; 利用部分匹配表进行匹配; 5.

39120

字符串匹配算法KMP

不再列举了,面对产品经理各种需求大家尽情发挥脑洞吧,那么开始进入今天的正题,溪源采用KMP字符串匹配算法解析此需求。 基础知识 根据上面介绍的需求,大家应该会对KMP算法解决的问题稍有理解。...KMP算法解决的问题:在字符串(主串)中是否能够定位出模式串(子串)。 上面提及到暴力匹配字符串,为什么不使用呢?时间复杂度O(m*n),而KMP算法时间复杂度为O(m+n)。...再介绍几个概念性的知识: 前缀:除最后一位以外,第一位依次与其余字符组成的字符串集合; 后缀:除第一位以外最后一位依次与其余字符组成的字符串集合; 简单举例: 字符串ABCD,其前缀:A,AB...因此KMP算法思想就是利用这个已知信息,不要重复比较已经比较过的位置,而是继续将P串向后移动几位。 重点来了,向后移动几位呢?此时便用到了上面介绍的部分匹配表。...源码实现 public class Kmp { /** * * @param originString 源字符串 * @param subString 子串

66030

算法】查找字符串KMP 算法

简单直接的字符串查找算法 算法原理 首先,如果只是笼统地从一个字符串中查找另一个字符串,有一种很直接的方法,那就是: 从 S 的第 1 个字符开始,与 W的每一个字符一一匹配。...KMP 算法详解 算法原理 其实,KMP算法可以用我们前面说的直接算法来套用: 从 s 的第 1 个字符开始,与 w 的每一个字符一一匹配。...算法流程图 下图是 KMP 算法的流程图: ? 与直接算法的对比 我们横向对比一下直接查找字符串算法KMP 算法,会发现,其实就是紫色框内的部分不同而已。 ?...算法性能 KMP 算法的时间复杂度是 O(n+m),因为正常情况下m 小于等于n,因此 O(n+m) 也就是 O(n)....两种算法的编程实现 直接匹配算法 有了流程图,我们来实现代码就容易多了,我们可以先从直接匹配算法开始: ? KMP 算法 对应的 KMP 算法代码如下: ?

1.1K10

Python|实现KMP算法字符串匹配

问题描述 在解决字符串匹配问题中,若不使用python内置函数,大部分时候会想到使用BF(暴力循环)算法来解决。...然而,这样会产生一个问题:算法的时间复杂度过高,匹配的字符串过长,往往会导致计算结果超时。如果使用KMP算法就能减少不必要的循环匹配计算,极大的减少算法的时间复杂度。...解决方案 BF算法KMP算法 BF算法主要是暴力循环匹配,即模式串的字符一个一个的去循环匹配。...KMP算法则巧妙的避免了不必要的循环匹配;首先计算出模式串每个匹配字符的下标,即数组next,然后再进行匹配。...算法的应用及其特点,在算法时间复杂度上的优点,以及与BF算法的不同,并演示如何用python代码来实现KMP算法来解决字符串匹配问题。

1.2K10

字符串KMP算法还能干这个!

(或者子字符串 "abcabc" 重复两次构成。) 思路 这又是一道标准的KMP的题目。 我们在字符串:都来看看KMP的看家本领!里提到了,在一个串中查找是否出现过另一个串,这是KMP的看家本领。...那么寻找重复子串怎么也涉及到KMP算法了呢? 这里就要说一说next数组了,next 数组记录的就是最长相同前后缀( 字符串:听说你对KMP有这些疑问?...「强烈建议大家把next数组打印出来,看看next数组里的规律,有助于理解KMP算法」 如图: ?...的文章,首先是字符串KMP是时候上场了(一文读懂系列)讲解KMP算法的基础理论,给出next数组究竟是如何来了,前缀表又是怎么回事,为什么要选择前缀表。...针对这些问题,我在字符串:听说你对KMP有这些疑问?中又给出了详细的讲解。 在留言区留下你的思路吧!

56540
领券