1.算法的目的是为了优化主字符串s匹配过程回退的问题。
2.s的指针在匹配过程中只会向后走,p的模式串的指针分为两种情况,
(1)如果当前恰好匹配的上,p的指指针ij
(2)如果当前匹配不上,就在模式串p中寻找匹配的上的指针,这一过程要用到next数组,如果在查找完next的数组之后,匹配上了,对当前j(在建立next数组时要记录下j,j代表了能够匹配上的最长长度,对于匹配主串只需要判断j是否等于模式串长度n即可)
3.next数组的建立
(1)next数组的建立要用到递推,前提条件是next[1]=0;
(2)比较过程和上述一样要用到next数组,但是不慌,next数组会在递推过程中建立
(3)next数组注重的是比较的过程,即比较过程中,i仍然单调向后,通过改变j实现匹配,匹配的过程需要记录下当前j的位置,因为这个位置就是当前位置前缀和后缀相等的最长距离。
具体过程!整个过程其实就是递推过程,这样理解会简单很多。
for(int i=2,j=0;i<=n;i){
//i从2开始,意味着我们想要求得的next下标
//j代表当前i的前一个next[i]为多少
while(j && p[i]!=p[j+1]) j=ne[j];//如果不判断j的条件,会一直匹配’\0’
if(p[i]==p[j+1]) j++;
//
//不断向前的过程是从由于当前匹配不上所以不得不减小范围,
//减小范围的过程也是按照next值去查找重复前缀的过程。
//如果匹配上了,当前j即可自加,
//因为j是能够匹配上的最大值,所以直接+1
//就是当前i的next值
ne[i]=j;
}