首页
学习
活动
专区
工具
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算法之前,首先看两个貌似无关的概念:前缀和后缀。前缀是指除最后一个字符或多个字符的字符串组合,后缀是指除第一个字符或多个字符的字符串组合。...由概念可知,对于字符串 T,若其前缀和后缀的最长重复字符串为 PM,则 PM 完全匹配 T 的开头 len(PM) 个字符串,且完全匹配 T 的结尾 len(PM) 个字符串。...KMP算法中查找 M 在 S 中位置,在匹配过程中,通过分析 M 与 S 的已匹配字符串信息来避免回退现象,过程如下: 从 S 的第一个字符开始进行逐个扫描对比: ?...KMP 算法保证了 i 指向的 S 中位置不需要进行回退,可以减少无效的回退造成的性能浪费。

    1.8K30

    字符串匹配: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.5K100

    算法 | 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算法,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

    6.1 KMP算法搜索机器码

    KMP算法是一种高效的字符串匹配算法,它的核心思想是利用已经匹配成功的子串前缀的信息,避免重复匹配,从而达到提高匹配效率的目的。...KMP算法的核心是构建模式串的前缀数组Next,Next数组的意义是:当模式串中的某个字符与主串中的某个字符失配时,Next数组记录了模式串中应该回退到哪个位置,以便继续匹配。...在字符串匹配时,KMP算法从主串和模式串的开头开始逐个字符比较,若发现匹配失败,则根据Next数组中的值进行回退,从失配位置的下一位重新开始比较。...搜索特征码为了能让读者更好的理解KMP特征码搜索的实现原理,这里笔者依然在MemoryTraversal函数基础之上进行一定的改进在本次改进中,我们增加了memcmp函数,通过使用该函数我们可以很容易的实现对特定内存区域的相同比较...,其他位置并没有任何变化,此处主要增加的函数有GetNextval以及KMPSearchString,这两个函数的核心思想是利用KMP算法,在主字符串中寻找子字符串时,遇到匹配失败的字符时,能够跳过一些已经比较过的字符

    24110

    6.1 KMP算法搜索机器码

    KMP算法是一种高效的字符串匹配算法,它的核心思想是利用已经匹配成功的子串前缀的信息,避免重复匹配,从而达到提高匹配效率的目的。...KMP算法的核心是构建模式串的前缀数组Next,Next数组的意义是:当模式串中的某个字符与主串中的某个字符失配时,Next数组记录了模式串中应该回退到哪个位置,以便继续匹配。...在字符串匹配时,KMP算法从主串和模式串的开头开始逐个字符比较,若发现匹配失败,则根据Next数组中的值进行回退,从失配位置的下一位重新开始比较。...搜索特征码 为了能让读者更好的理解KMP特征码搜索的实现原理,这里笔者依然在MemoryTraversal函数基础之上进行一定的改进在本次改进中,我们增加了memcmp函数,通过使用该函数我们可以很容易的实现对特定内存区域的相同比较...,其他位置并没有任何变化,此处主要增加的函数有GetNextval以及KMPSearchString,这两个函数的核心思想是利用KMP算法,在主字符串中寻找子字符串时,遇到匹配失败的字符时,能够跳过一些已经比较过的字符

    25140

    字符串匹配算法: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数组的每一个元素存储

    50900

    揭开JavaScript字符串搜索的秘密:indexOf、includes与KMP算法

    本文将揭示三种常用的JavaScript字符串搜索技术:indexOf、includes和KMP算法,并通过实际代码示例展示如何在数据采集的情况下实现这些技术。...KMP算法是一种高效的字符串搜索算法,特别适用于在大文本中搜索长模式的情况。...// KMP字符串搜索算法实现function kmpSearch(pattern, text) { if (pattern.length === 0) return 0; let lsp = [0...结论本文介绍了三种常用的JavaScript字符串搜索技术:indexOf、includes和KMP算法,并提供了结合爬虫代理IP技术的实现示例。...indexOf()includes()search()match()高级字符串搜索算法KMP算法(Knuth-Morris-Pratt)实现数据采集的字符串搜索细节基本字符串方法indexOf()indexOf

    14610

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

    注意,是KMP算法,不是MMP哈,我没有骂人。KMP算法是用来做字符串匹配的,除了KMP算法分,还有暴力匹配算法,也是用来做字符串匹配的。接下来先看看暴力匹配算法,你就知道为啥会出现KMP算法了。...介绍: KMP算法,是一个判断字符串是否在另一个字符串中出现过的算法,如果出现过,返回最早出现的位置。...和暴力匹配算法不同的是,KMP算法会用一个next数组来保存字符串中前后最长公共子序列的长度,每次回溯时,通过next找到前面匹配过的位置,这样就省了大量的时间。 2....现在我们已经知道str2中的ABCDAB中str1中是存在的,KMP算法的思想就是利用这个已知信息,不要把搜索位置移回到前面,因为前面的肯定是不匹配的。那么应该从哪儿开始比较呢?...KMP算法使用步骤: 首先得到匹配串的部分匹配表; 利用部分匹配表进行匹配; 5.

    42020

    字符串匹配的KMP算法

    许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。它以三个发明者命名,起头的那个K就是著名科学家Donald Knuth。...这种算法不太容易理解,网上有很多解释,但读起来都很费劲。直到读到Jake Boxer的文章,我才真正理解这种算法。下面,我用自己的语言,试图写一篇比较好懂的KMP算法解释。 1....因为B与A不匹配,搜索词再往后移。 3. 就这样,直到字符串有一个字符,与搜索词的第一个字符相同为止。 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

    不再列举了,面对产品经理各种需求大家尽情发挥脑洞吧,那么开始进入今天的正题,溪源采用KMP字符串匹配算法解析此需求。 基础知识 根据上面介绍的需求,大家应该会对KMP算法解决的问题稍有理解。...KMP算法解决的问题:在字符串(主串)中是否能够定位出模式串(子串)。 上面提及到暴力匹配字符串,为什么不使用呢?时间复杂度O(m*n),而KMP算法时间复杂度为O(m+n)。...综上可以得出下面的表格: 搜索串 A B C D A B D 部分匹配值 0 0 0 0 1 2 0 逻辑解析 经历过上面的基础知识介绍后,下面开始一步步逻辑解析整个匹配过程: 字符串"BBC ABCDAB...因此KMP算法思想就是利用这个已知信息,不要重复比较已经比较过的位置,而是继续将P串向后移动几位。 重点来了,向后移动几位呢?此时便用到了上面介绍的部分匹配表。...源码实现 public class Kmp { /** * * @param originString 源字符串 * @param subString 子串

    68030

    算法】查找字符串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

    算法字符串KMP模式匹配

    在朴素的模式匹配算法中,主串的pos值(i)是不断地回溯来完成的(见字符串的基本操作中的Index函数)。而计算机的大仙们发现这种回溯其实可以是不需要的。...下面摘录一段阮一峰所写关于kmp的文章,增进理解: ? 因为空格与C 不匹配,搜索词还要继续往后移。这时,已匹配的字符数为2("AB"),对应的"部分匹配值"为0。...所以,移动位数 = 2 - 0,结果为 2,于是将搜索词向后移2位。 "部分匹配值"就是"前缀"和"后缀"的最长的共有元素的长度。...*/ 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
    领券