next数组:
要搞懂kmp算法,首先要了解next数组
那么,next数组到底是求什么的呢?
举个例子,有一个字符串abcabdabc,
要求它的最长的相同前缀后缀。
所谓前缀,就是包含了首字母的字符串字串;
所谓后缀,就是包含了末尾字母的字符串字串。
所以啊,这个abcabdabc的最长的相同前缀后缀呢,显然是abc这个字串,长度为3.
而这个字符串的next数组是什么意思呢?:
next[0],就是求a的最长相同前缀后缀,并把长度存储进next数组;
next[1],就是求ab的最长相同前缀后缀,并把长度存储进next数组;
next[2],就是求abc的最长相同前缀后缀,并把长度存储进next数组;
…
next[8],就是求abcabdabc的最长相同前缀后缀,并把长度存储进next数组。
现在,为了简化代码,我们对这个next数组做一个约定:
1.当字符串没有相同前缀后缀时,next存储的长度为-1,显然,next [0]=-1。
2.当字符串有相同前缀后缀时,next存储的长度为其长度-1。
看到这,你应该试试自己写一个字符串,并试着推出next数组的代码了。
NEXT数组代码实现:
static void Next(String str) {
int length = str.length();
next = new int[length];
int k = -1;
next[0] = -1; //第一个数必定为-1
for (int i = 1; i < length; i++) {
//k>-1 就是先找到与第一个数相同的数
while (k > -1 && str.charAt(k + 1) != str.charAt(i))//如果下一个不同,那么k就变成next[k],注意next[k]是小于k的,无论k取任何值。