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

字符串匹配算法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

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

    KMP 字符串匹配算法

    KMP(Knuth-Morris-Pratt) 算法是一种常见的字符串匹配算法,在主字符串 S 中查找字符串 M 出现的起始位置,通过 M 的自身信息来减少无效的查询次数。...KMP算法 在了解KMP算法之前,首先看两个貌似无关的概念:前缀和后缀。前缀是指除最后一个字符或多个字符的字符串组合,后缀是指除第一个字符或多个字符的字符串组合。...KMP算法中查找 M 在 S 中位置,在匹配过程中,通过分析 M 与 S 的已匹配字符串信息来避免回退现象,过程如下: 从 S 的第一个字符开始进行逐个扫描对比: ?...KMP 算法保证了 i 指向的 S 中位置不需要进行回退,可以减少无效的回退造成的性能浪费。...在实际代码中不存在将 M 右移 len(T)-len(PM) 个字符的操作,可以直接更新 j 的值为 len(PM) 即可,指向待比较的字符位置。

    1.8K30

    字符串匹配:KMP算法

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

    2.5K100

    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(百度百科) Knuth-Morris-Pratt algorithm(Wikipedia) Knuth-Morris-Pratt algorithm(String Matching

    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.2K20

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

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

    42020

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

    1.5K40

    字符串匹配算法KMP

    (暴力匹配); 以上两种方案都能解决;然后大家需要考虑性能、维护和代码整洁性,可能居多使用方案二; 需求二:项目结论中即存在正常、成功的结论,又存在以上列举的失败字段; 例如: //存在异常错误 String...不再列举了,面对产品经理各种需求大家尽情发挥脑洞吧,那么开始进入今天的正题,溪源采用KMP字符串匹配算法解析此需求。 基础知识 根据上面介绍的需求,大家应该会对KMP算法解决的问题稍有理解。...KMP算法解决的问题:在字符串(主串)中是否能够定位出模式串(子串)。 上面提及到暴力匹配字符串,为什么不使用呢?时间复杂度O(m*n),而KMP算法时间复杂度为O(m+n)。...因此KMP算法思想就是利用这个已知信息,不要重复比较已经比较过的位置,而是继续将P串向后移动几位。 重点来了,向后移动几位呢?此时便用到了上面介绍的部分匹配表。...源码实现 public class Kmp { /** * * @param originString 源字符串 * @param subString 子串

    68030

    算法】查找字符串KMP 算法

    KMP 算法详解 算法原理 其实,KMP算法可以用我们前面说的直接算法来套用: 从 s 的第 1 个字符开始,与 w 的每一个字符一一匹配。...算法流程图 下图是 KMP 算法的流程图: ? 与直接算法的对比 我们横向对比一下直接查找字符串算法KMP 算法,会发现,其实就是紫色框内的部分不同而已。 ?...两种算法的编程实现 直接匹配算法 有了流程图,我们来实现代码就容易多了,我们可以先从直接匹配算法开始: ? KMP 算法 对应的 KMP 算法代码如下: ?...PMT 的生成 要注意一点,对于 KMP 算法本身而言,我们把 PMT 作为已知条件,在代码中 PMT 作为算法函数的输入参数直接传入。...在面试的时候,一般不需要写 PMT 的生成部分,毕竟考察的是 KMP 算法。 当然,如果真的要运行程序,还是需要现针对 w 生成 PMT 的。这部分代码大家可以到 github文件中查看。

    1.1K10

    算法字符串KMP模式匹配

    在朴素的模式匹配算法中,主串的pos值(i)是不断地回溯来完成的(见字符串的基本操作中的Index函数)。而计算机的大仙们发现这种回溯其实可以是不需要的。...下面摘录一段阮一峰所写关于kmp的文章,增进理解: ? 因为空格与C 不匹配,搜索词还要继续往后移。这时,已匹配的字符数为2("AB"),对应的"部分匹配值"为0。...的前缀和后缀都为空集,共有元素的长度为0;   - "AB"的前缀为[A],后缀为[B],共有元素的长度为0;   - "ABC"的前缀为[A, AB],后缀为[BC, C],共有元素的长度0; 示例代码...*/ int IndexKMP(String Src, String Sub, int pos) {     cout << "KMP Index ..." << endl;     int i = pos... next);*/     GetNextVal(Sub, next);     while (i < len1 && j < len2)     {         /* 两字母相等则继续,与朴素算法增加了

    1.7K80

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

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

    1.2K10

    【JavaScript 算法KMP算法:高效的字符串匹配

    KMP算法(Knuth-Morris-Pratt Algorithm)是一种用于在文本中高效查找子串的字符串匹配算法。...它通过预处理模式字符串,构建部分匹配表(又称为失配表),在匹配过程中避免重复扫描,从而提高匹配效率。本文将详细介绍KMP算法的原理、实现及其应用。...一、算法原理 KMP算法的核心思想是在匹配过程中利用已经匹配的部分信息来避免重复匹配。其主要步骤如下: 构建部分匹配表:对于模式字符串中的每个位置,计算在该位置之前的子串的最大前缀和后缀的长度。...四、总结 KMP算法是一种高效的字符串匹配算法,通过构建部分匹配表,在匹配过程中避免重复扫描,从而提高匹配效率。...理解和掌握KMP算法,可以有效解决字符串匹配问题,广泛应用于字符串查找、文本编辑、DNA序列分析和数据挖掘等领域。

    22210
    领券