在KMP算法中,有两个重要的步骤就是需要对模式串求解其Next数组和NextVal数组。
网络上的文章有许多关于求解这两个数组的文章。然而,绝大多数文章都是告诉你这两个数组是怎么求解的,而且这些文章由于实现的标准不同。对于同样的字符串,他们求解出的Next数组和NextVal数组往往是不相同的,尽管它们都是对的。
这样的文章不仅看起来非常费劲,而且在花了很多功夫看完后,往往是知道了怎么求Next和NextVal值,却不清楚这些算法到底求了什么。
接下来,我将根据我的理解对它们提出定义:
Next值
对于字符串s,由s可得前缀子字符串集合以及后缀子字符串集合。其中表示字符串s的长度。表示空字符串。
则Next值定义如下:
简单点讲:Next 值就是字符串s的最长相同前缀和后缀子字符串的长度。
NextVal值
记c表示字符串s的后续字符。用函数形式表示为c=bak(s)
同时,我们定义前缀子字符串的后续字符如下:,其中s[k]表示字符串s的第k的字符。简单讲就是s'在s中的下一个字符。
则NextVal值定义如下:
特殊情况:当时,NextVal将取值为-1。
简单点讲:NextVal值就是字符串s的的最长相同且满足后续字符不同的前缀和后缀子字符串的长度。
Tip:
在KMP算法中,记初始输入字符串为T,则求解Next(k)和NextVal(k)时,上述的s对应subStr(T,1,k),后续字符c对应T[k+1]。