首先 我们来看一下求next数组的代码
如果我们手算ababa的next的数组的话 我们会得到以下值
我们按照代码的逻辑走一遍
我们会发现得到的和手算的next数组一模一样 为什么呢?
首先 我们需要了解一点 next[j+1]最大为next[j]+1
这点应该都不难理解 因为最佳情况下next[j+1]最大的公共前后缀就是当next[j]的公共前后缀各往后移一位。所以例如next[5]=2,那么next[6]在最好的情况下等于3.
既然如此我们就不难理解为什么上来会先判断ch[i]==ch[j]。
那么else j=next又是为什么呢?
首先我们先来看个图
假设有10个字母
如果我们现在要求next[10]那么我们一定是知道next[9]的值 假设此时next[9]=5 我们此时只需要判断ch[9]是否等于ch[5]在最好的情况下ch[9]等于ch[5]那么此时next[10]=6
如果不等的话 我们会让j=next[j]
这是为什么?
首先 我们知道图中所示的两个方框是相等的(因为next[9]=5)此时 我们若想找到next[10]的那么肯定要找到和ch[9]相等的字母,同时又想要公共前后缀尽可能的大,此时 我们通过next[9]=5可以知道 ch[8]=ch[4] 但是ch[10]的前缀肯定是从ch[1]开始的 ,想到这里我们不难发现ch[4]是ch[5]的后缀,那我们此时去找ch[5]的公众前后缀不就可以找到ch[9]的公共前后缀了嘛(此时找到的ch[9]的公共前后缀比上一次找到的ch[9]的公共前后缀小一点).假如ch[5]=3 那么说明ch[1]=ch[3] ch[2]=ch[4]那么 此时ch[1]=ch[7],ch[2]=ch[8](因为next[9]=4,所以ch[3]=ch[7],ch[4]=ch[8]) 那么我们判断一下ch[9]是否等于ch[3]就可以 如果等于 那么 next[10]=4否则 就重复上述操作.直到j=0时 让ch[10]=1,所以else的情况下,我们让j=next[j].