首页 > 其他分享 >KMP

KMP

时间:2023-04-06 16:02:58浏览次数:24  
标签:匹配 后缀 位置 失败 KMP 移动

2021 年就学了KMP,2023写一篇详细点的总结。

首先我们需要理解朴素做法

  • 枚举开始匹配的位置 \(i\),和匹配串中的每个位置逐一匹配,失败就停止移动继续匹配,最坏情况复杂度高达 \(O(mn)\)

上述做法的缺陷就在于没有充分利用信息,比如匹配失败时就从头开始。我们考虑一次匹配中,如果失败了,那么至少需要移动多少,首先贴一张图。
img
如上图所示,蓝色的线段表示文本串,红色的串表示模式串,竖着的绿线表示在某次匹配中,竖线及其之前的所有位置均已匹配成功,红圈和绿圈的两个位置为第一次匹配的失败位置。那匹配之后至少要移动多少呢,假设是最下面红色线段的位置,那么画橙圈的部分必然的部分必然全等,而因为两个红色的是平移构造而成的,所以对应位置全等,所以本质上就是前缀和后缀相等。而为了求出最少移动距离就可以转换为最大前后缀长度。接下来就是求这个最长公共前后缀的问题了。这个求解方式其实和上述的匹配过程基本一致,还是以图为例。用 \(ne_i\) 表示匹配到 \(i\) 的结果。
img
上图中我们已经求好了位置 \(i\) 之前的所有答案,现在想要推出后面的,由于前面的位置相等,其实还是一样的方法就行了。

标签:匹配,后缀,位置,失败,KMP,移动
From: https://www.cnblogs.com/wscqwq/p/17293043.html

相关文章

  • KMP算法
    一、问题引入BF算法的平均时间复杂度过高,提出了一种新的匹配算法KMP算法。主串S的位置i一直往下移动,不再回溯。但字串T的位置j需要根据算法确定下来。二、解决过程函数:get_next()voidget_next(constchar*T,int**next){ inti=0,j=-1; intT_len=strlen(T......
  • KMP算法--模板
    生成Pattern的字符串的next数组,长度为m+1点击查看代码voidgetNext(vector<int>&next,string&pattern){intn=pattern.size();for(intj=0,k=-1;j<n;){if(k==-1||pattern[j]==pattern[k])next[++j]=++k;......
  • KMP字符串匹配算法
     KMP算法的要点是避免回溯和Next[]数组,其中,Next[]数组中存的是最长公共前后缀的长度. 1.KMP模板例题:HDU2087剪花布条 intNext[N],cnt;//构建Next[]数组voidg......
  • kmp
     1.模板题:给定两个数字序列 a[] 和 b[],b[] 有可能整体作为一个连续子序列出现在了 a[] 中,现在请你找出 b[] 在 a[] 中第一次出现的位置(起始位置从1开始计数......
  • KMP算法
    目录KMP算法前缀函数的定义举例前缀函数的应用KMP算法统计每个前缀的出现次数字符串压缩应用应用1:Leetcode题目分析代码实现KMP算法Knuth-Morris-Pratt字符串查找算法(简......
  • KMP算法
    KMP算法简介一种由Knuth(D.E.Knuth)、Morris(J.H.Morris)和Pratt(V.R.Pratt)三人设计的线性时间字符串匹配算法。该算法主要解决的就是字符串匹配的问题。本文参考前缀......
  • KMP算法思考
    第一个全匹配没有价值,从第二个开始    采取每次匹配的最大值,则next数组为 计算next数组时也用了KMP算法,因此当不匹配时,j=next[j]; ......
  • 希尔排序、快速排序、KMP算法
    希尔排序背景对N个样本进行排序,顺序为从小至大步骤第一步:对样本不断确定分组的间隔gap,确定分组次数X-》对应第一个循环第一次gap=N/2;第二次gap=gap/2;......
  • KMP
    KMP算法思路有如下情况(这里原串&子串都是从1开始)原串\(s\)(以下简称\(s\))和子串\(p\)(以下简称\(p\))进行匹配,直到黑色分界线时都是匹配的,直到其后面一个元素不相等,\(s[i]......
  • 字符串匹配之KMP算法中的pnext表
    pnext表的分析上篇我们提到了最后是构建一个pnext表,记录着每个字符匹配需要移动的长度的位置信息,接着上篇的内容,我们来分析下pnext表的构造。还是举个栗子:ababcabcacb......