一、
例如:
位置i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
字符串 | a | b | a | a | b | c | a | c |
next [ i ] | 0 | 1 | 1 | 2 | 2 | 3 | 1 | 2 |
很久没看KMP了,但数据结构老师讲到了这里,还是得好好看看。想起以前学的时候的绞尽脑汁,就期待老师能讲出通俗易懂的理解来。结果把我的理解讲混沌了,但是确实得到了一个特简单直接写出next数组的方法。
如下:
首先我是next数组从-1开始的,但为了方便看,一下都从1开始。
next[1] = 0 , next [2] = 1,这是毫无疑问的。
然后就是求后面的,
i = 3 时,前缀有a,后缀有b ,最大子串的长度为0 ,则 next[3] = 1 ;
i = 4 时,前缀有a,ab,后缀有a,ba ,最大相同子串的长度为1 ,则 next[4] = 2 ;
i = 5 时,前缀有a,ab,aba,后缀有a,aa,baa,最大相同子串的长度为1 ,则 next[5] = 2 ;
那么总结可得next[n] 的情况,将前面n-1个字符,观察对应位置前缀和后缀最大的相同子串的长度,如果找到,那么next值是该长度加1,否则next值是1。
二、
next数组的求解方法是:(来自https://blog.csdn.net/guo_love_peng/article/details/6618170 写的真好!)
第一位的next值为0,第二位的next值为1。
后面求解每一位的next值时,根据前一位进行比较。
首先将前一位与其next值对应的内容进行比较:
1、如果相等,则该位的next值就是前一位的next值加上1;
2、如果不等,向前继续寻找next值对应的内容来与前一位进行比较,直到找到某个位上内容的next值对应的内容与前一位相等为止,则这个位对应的值加上1即为需求的next值;
3、如果找到第一位都没有找到与前一位相等的内容,那么需求的位上的next值即为1。
以上两种方法都是求next数组的,但是有时这种next数组仿佛并不简单实用,例如 : aaaab这种情况。
那么就需要改良优化了。
具体模板如下:(来自 https://blog.csdn.net/u012043391/article/details/52815909)
1、nextval[ 1 ] = 0;
2、从i = 2 开始,若要求nextval[i],将next[i]的值对应位的值与i的值进行比较:a.若相等,则nextval[ i ] = nextval[ next[i] ];
b.若不相等,则nextval[ i ] = next[ i ];
位置i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
字符串 | a | b | a | a | b | c | a | c |
next [ i ] | 0 | 1 | 1 | 2 | 2 | 3 | 1 | 2 |
nextval [ i ] | 0 | 1 | 0 | 2 | 1 | 3 | 0 | 2 |