数据结构-kmp最易懂算next与nextval值计算

什么是kmp算法

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息

求字符串 ‘ababaabab’ 的next, nextval (题目来自牛客)

1.maxL的计算
maxL:首个为0,计算包含当前字符的串的最大相同的前后缀中的字符的个数。
字符串 'ababaabab’的部分匹配表
——‘a’ 共有元素0个
——‘ab’共有元素0个
——‘aba’ 前缀:[ a ] ,[ ab ]后缀:[ ba ] , [a]共有元素1个
——‘abab’前缀:[ a ] ,[ ab ] ,[ aba ] ; 后缀 :[ bab ] , [ ab ] , [ b ] ;共有元素俩个
,,,,直至字符串最后一个按照上述方式
2.next的计算
next:首个为0,填入前一个序号的maxL的值+1.举例:序列2的next的值等于序列1的maxL的值+1
即:next[ 2 ] = maxL[ 1 ] + 1 ;
3.nextval的计算
nextval:首个为0,比较maxL和next的值,若不同,填入next的值;若相同,填入该值对应的序号的nextval。

序号 1 2 3 4 5 6 7 8 9
模式串t a b a b a a b a b
maxL 0 0 1 2 3 1 2 3 4
next 0 1 1 2 3 4 2 3 4
nextval 0 1 0 1 0 4 1 0 1

你可能感兴趣的:(数据结构,查找,数据结构,kmp算法,查找)