KMP算法 学习笔记

学习知乎大牛 https://www.zhihu.com/question/21923021 笔记![在这里插入图片描述](https://img-blog.****img.cn/20200618090222528.png?x-oss-process=imagKMP算法 学习笔记
代码把握住 i和j指向的是啥就好接受了,i指向的next数组的下标 只能递增j指向i所指字符之前的字符串的最大交集前缀末尾+1的下标

也就是说 只有if里面的成立了 才执行next[]的新赋值。

else 语句是:
当串不能在上一最大交集串的基础上增加时(也就是P[i]!=p[j]),检查最大交集前缀字符串里next值
KMP算法 学习笔记
此处next[3]等于1,j=next[j],j的值成为1,指向串的最大前后缀交集的前缀的尾。

一定记得j指向的是什么?next[j]指的又是什么?

用文字表述下代码的流程

1、给j和i和next[i]赋初值
2、只要next数组没有计算完成进行以下步骤
3、j == -1(判断开始?)或者p[i] ==p[j](主串的前缀尾与后缀尾是否一致?)
4、若一致赋值next[i] = j; j指向字串最大前缀后一个字符串,同时也代表前缀后缀交集的最大长度。
5、若不满足3条件,则代表前缀后缀交集没法增加了,所以就缩短前缀。。。。。此处又卡住了。。。。。。如图1,显然后缀尾与前缀尾不一致,需要缩短长度,那么缩短长度为多少呢?

需要看前缀next值了,也就是abab 不行,就找aba的前后缀交集
KMP算法 学习笔记
发现此时j指向了b,一样j指向的公共交集的前缀尾字符a,在后缀就有一样的字符a,
然后判断 ab 是否 匹配 ac

乱七八糟 ,,,一定要感受那个中庸的思想,太极生两仪,两仪生四象,四象生八卦。。。
主串分前后缀。。前或后缀再分前或后缀。。。