kmp算法如何构建next数组(代码片段)

我永远信仰 我永远信仰     2022-12-04     644

关键词:

在模拟 KMP 匹配过程之前,我们先建立两个概念:

  • 前缀:对于字符串 abcxxxxefg,我们称 abc 属于 abcxxxxefg 的某个前缀。
  • 后缀:对于字符串 abcxxxxefg,我们称 efg 属于 abcxxxxefg 的某个后缀。

后缀就是相当于这个字符串减去第一个字符剩下的字符串。
前缀就是相当于这个字符串减去最后一个字符剩下的字符串。

next数组的值
储存从位置0开始到当前位置的字符串的前后缀的最长相等前后缀

举个例子:

  • 字符串 a 没有前后缀,值为0.
  • 字符串 aa 的前缀只有a,后缀只有a,值为1.
  • 字符串 aab 的前缀有a,aa,后缀有a,ab,最长相等前后缀值为1,但在b的位置没有,a,a这一对是属于aa字符串的,也就是下标为1的时候,所以这个的next数组为next=[0,1,0]

在这里插入图片描述
aaa,下标为2的时候值当然是2
aaab,下表为3的时候值是0.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

kmp算法(代码片段)

目录KMP算法基本思想计算next数组前缀和后缀公共部分的最大长度next数组匹配字符串KMP算法基本思想算法由两部分组成计算ptr每一位及之前的字符串中,前缀和后缀公共部分的最大长度的next数组匹配ptr和str,当ptr失配时,利用nex... 查看详情

kmp算法(代码片段)

...把子串的next[j]位置移动至与主串当前位置比较;因此KMP算法的主要过程就在于求子串的next数组了。 2.nextval数组:对next数组进一步改进,如果跳转到的nex 查看详情

kmp算法(next数组方法)(代码片段)

KMP算法之前需要说一点串的问题:串:字符串:ASCII码为基本数据形成的一堆线性结构。串是一个线性结构;它的存储形式:typedefstructSTRING  CHARACTER*head;  intlength;;朴素的串匹配算法:设文本串text="ababcabcacbab",模式串为patten=... 查看详情

数据结构-串手算kmp算法的next和nextval数组(代码片段)

手算KMP算法的next数组例:求串’ababaaababaa’的next数组手算KMP算法的nextval数组nextval数组可由next数组求得,具体求法看以下代码://由next数组求得nextval数组strings;//模式串for(inti=0;i<s.length();i++)if(s[i]!=s[ne 查看详情

kmp算法(代码片段)

KMP基本思路很简单,关键在于求失配数组,也就是next数组next[k]表示[0,k]的最长真前缀后缀的索引(不包括p[0,k])假设我们现在有了p[0,i-1]的最长真前缀后缀索引为k,如何求p[0,i]的最长真前缀后缀呢?p[i]==p[k+1],那么很显然next[i]=k+1p... 查看详情

kmp算法讲解(代码片段)

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹... 查看详情

kmp算法(代码片段)

概述KMP(Knuth-Morris-Pratt)算法是一种用来解决字符串匹配问题的算法,时间复杂度为O(n+m),主要思想是当模式串与主串发生失配时,不必从头开始匹配,而是滑动到已经匹配的部分next数组在KMP算法中,next数组用来存储一段子串最... 查看详情

数据结构串---kmp模式匹配算法之获取next数组(代码片段)

(一)获取模式串T的next数组值1.回顾我们所知道的KMP算法next数组的作用next[j]表示当前模式串T的j下标对目标串S的i值失配时,我们应该使用模式串的下标为next[j]接着去和目标串失配的i值进行匹配而KMP算法的next求值函数我们可... 查看详情

next数组修正版kmp算法(代码片段)

publicclassKmpStringsnippet;StringsearchText;int[]next;publicKmp(StringinputString)this.snippet=inputString;//next=newint[this.snippet.length()];publicvoidsetNext(StringsearchText)this.searchText=searchText;//StringcopySnippet=searchText;this.next=newint[searchText.length()];this.next[0]=-1;for(intf... 查看详情

经典算法——kmp,深入讲解next数组的求解(代码片段)

前言    之前对kmp算法虽然了解它的原理,即求出P0···Pi的最大相同前后缀长度k;但是问题在于如何求出这个最大前后缀长度呢?我觉得网上很多帖子都说的不是很清楚,总感觉没有把那层纸戳破,后来... 查看详情

[数据结构]kmp算法(代码片段)

目录1、暴力匹配(BF)算法2、KMP算法next数组(手动求,方便求解题目)值得思考的两点注意:日常数据结构题目问next数组的值,需要在此方法求出next基础上,全部加1next数组(公式求,方... 查看详情

kmp算法(代码片段)

目录简述暴力算法与整体框架暴力KMP框架next数组最长前缀后缀引理根据引理求解next数组f数组求解求解模板题总结简述KMP算法,又称模式匹配算法,能够在线性时间内判定字符串(A[1-N])是否为字符串(B[1-M])的子串。对于刚刚接触KM... 查看详情

kmp算法(字符串的匹配)(代码片段)

...度为m,子串为n,时间复杂度会到达O(m*n),而如果用KMP算法,复杂度将会减少线型时间O(m+n)。 设主串为ptr="ababaaababaa";,要比较的子串为a=“aab”; KMP算法用到了next数组,然后利用next数组的值来提高匹配速度,我首... 查看详情

kmp&拓展kmp(代码片段)

KMP算法解析KMP算法是一种比较高效的字符串匹配算法,可以在线性时间内找出匹配位置和匹配长度。详解KMP板子(next)数组存在的意义:当(A)串匹配到(i),(B)串匹配到(j)时,如果发现失配,可以直接令(j=next[i])然后继续匹配,((next[... 查看详情

kmp算法详解——多图,多例子(c语言)(代码片段)

目录前言1.KMP算法是什么?2.为什么需要KMP算法?2.1主串找字串2.2暴力求解3.KMP准备工作3.1字符串的前后子串3.2最大前后相等子串3.3最大前后相等子串练习4.KMP算法4.1简看KMP算法5Next数组     5.1j该回溯的位置 5.2学会计算... 查看详情

kmp算法——详解next数组(代码片段)

...不完善,只是为了提示自己,如果您已研究了KMP算法,本文或许对您的帮助并不大next数组完成的任务:当s1与s2字符串比较到上图所示位置时,拥有next数组的KMP算法不需要像BF算法一样:将j回退到开始的第... 查看详情

kmp算法模板(代码片段)

sub[]代表子串,str[]代表原串,next[]代表当sub[i]!=str[j]时,子串需要跳到的地方,实现代码如下:获取next数组的代码:1voidGetNext()//求子串中的相同的真前缀和真后缀23memset(next,0,sizeof(next));4next[0]=-1;5inti=0,j=-1;6intsub_len=strlen(sub);7while... 查看详情

kmp算法(代码片段)

1.目的在主串中快速,快速,快速地找到目标串  2.求解next数组   voidgetNext(StrNonfixsubstr,intnext[])intj=1,t=0;next[1]=0;while(j<substr.length)if(t==0||substr.ch[j]==substr.ch[t])next[j+1]=t+1;+ 查看详情