KMP 算法中 next 数组手工求解

KMP算法是一种改进的字符串匹配算法,如果不研究编码的话,手工实现还是比较简单,小型字符串甚至不需要你去求 next 数组就能看出来怎么移动。但是会有一些题目让你求解 next 数组,这里就以一个题目讲一下手工求解的过程。

例:求串 ‘ababaaababaa’ 的 next 数组

观察第一个元素,它没有前缀和后缀(串本身不能作为前缀或后缀),所以记录数据为0(这个数字表示当存在前缀和后缀相同的情况下,所能包含的最大的元素)

观察前两个元素,前缀为a,后缀为b,不相同,即没有相同的前缀和后缀,所以同样记录数据为0

观察前三个元素,存在前后缀相同的情况,为a,记录数据为1

观察前四个元素,同样存在前缀后缀相同的情况,为ab,记录数据为2

观察第五个元素,相同的前后缀为aba(ababa、ababa),记录数据为3

同理观察余下的(用加粗表示前缀、下划线表示后缀)

ababa_a_ 1

ababaa_a_ 1

ababaa_ab_ 2

ababaa_aba_ 3

ababaa_abab_ 4

ababaa_ababa_ 5

ababaaababaa 6

最后我们得到一组数值:0 0 1 2 3 1 1 2 3 4 5 6

在这组数开头添加 -1,并删去最后一个数值,数组变为: -1 0 0 1 2 3 1 1 2 3 1 1 2 3 4 5

所有值+1,变为:0 1 1 2 3 4 2 2 3 4 2 2 3 4 5 6,这就是我们需要的 next 数组

需要注意的是,不同的题目next[0]可能为-1,所以 -1 0 0 1 2 3 1 1 2 3 1 1 2 3 4 5 同样有可能作为 next 数组,但是这两种一定不会同时出现。

题目图片:

KMP 算法中 next 数组手工求解_第1张图片
image

你可能感兴趣的:(KMP 算法中 next 数组手工求解)