我觉得写出一篇能够看一遍就能理解KMP的博客是很难的,理解这个算法是需要时间和能力的,所以我就不不自量力的去尝试了,所以我就谈一谈我认为kmp学习中比较难理解的点和比较重要的点。建议学习过kmp但还是有疑惑的同学看。
我们看next数组
上一张图片吧,我现在箭头指向的是我现在要求第i为的next值,而0..i-1的next值都求过了。
先看next[i-1]
假设两段红色的相等,然后我们比较第i位和第next[i-1]+1位,如果相等,那么皆大欢喜,不然的话,这个next[i-1]就变成了next[next[i-1]],为什么呢。
看图
这个绿色的是next[next[i-1]],然后绿色的这一圈和蓝色的这一圈是相等的,因为他们都和红色的相等。那么我们只有比较第一段绿色的后一位和第i位就行了。如果还是不匹配的话,就再next一次。
同理,kmp中的匹配过程也就和这个一样了。
希望能够有所帮助