KMP算法详解,此次针对上一篇文章的next实现算法的改进
主串 | a | a | a | b | c | a | a | a | a |
子串 | a | a | a | a | |||||
下标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
- 由上图可以看到如果用next数组(请参考上一篇文章)来求子串的值为[-1][0][1][2],这样也就导致当我到下标3的时候a与b不相同,这个时候也就会指向下标2继续判断,直到到0,我们会发现这样其实做了很多多余的操作,我们直接把下标指向0不就好了吗,完全可以让下标为1,2,3的next值等于下标为0的next值。
- 由上面的解释我们大概可以了解了,我们需要进行对next数组改进,当后缀等于前缀时我们只需要让他指向到前缀的所指向的位置不就好了吗。
- 对于nextval的数组该怎么求值呢?当下标为0时与next数组一样为-1;当下标为1的时候next数组是0,我们发现这个时候前缀与后缀相同,我们就可以让它的值为前缀的next值,也就是next[1] = next[0] = -1;后面两个同理。
- 经过上面三步的推导我们对nextval的核心思想有个大概了解了&