之前一直对next数组产生理解的不好,今天突然顿悟,以此记录。
首先要理解next数组是对模式串的特性进行了处理。
设模式串为P
1.
假设模式串有如下特性:
当比较到k位置和j位置时(两个字符相等时下标后移)。
因此可以得到公式:
P[0 ~ k-1] == P[j-k ~ j-1]
当P[k] == P[j]时
P[0 ~ k-1] +P[k]== P[j-k ~ j-1]+P[j] 即:P[0 ~ k] == P[j-k ~ j]
由此得到:
next[j+1] == k + 1 == next[j] + 1
为什么会得到这样的一个公式呢?
可以这样理解:
因为从0到k和j-k到j是相等的,此时j+1的位置要填写的回溯值是k+1,即P[j+1] = k+1;
下面在说为什么k + 1 == next[j] + 1,因为next[j]里面存的是k,从上面的图可以看出当j位置发生失配时应该回溯的位置为k。
这里说明一下,当在比较k和j位置时其实是在填写P[j+1]的位置的回溯的值(回溯值即数组的下标)。
相信对KMP算法了解过的都知道,这里不再多说。如果看不懂可以先看看别的博客了解一下。
上面就是对next[j+1] == k + 1 == next[j] + 1这个公式的由来的解释。
当P[k] != p[j]时
当不相等时就比较简单了,因为next[j]中存储的就是当发生失配时需要回溯的位置,所以j = next[j]即可。
以上只是我对之前不理解的地方的看法,在此分享希望可以帮助和我一样困惑的同学。