我的理解里,kmp算法就是要看模式串里前缀后缀有没有共同的地方。当主串指针和模式串指针行进到不能匹配的位置时,主串指针先不动,根据已经通过匹配的子串,看模式串里(已经通过匹配的部分)前后缀是否有相同。若存在相同,则模式串指针移动到公共后缀的后一个字符(不包含公共前缀),然后再去和主串尝试匹配,也就是说这相当于前缀移动到后缀的位置(于是就实现了“主串当前指针之前通过匹配的子串不需要再参与匹配”)。
那么我的问题是?…
next数组产生的逻辑?…对,我能依靠记忆里的方法算出每个next值但是我不知道这样算背后的逻辑。
根据我的第一段描述里,我是知道要寻找公共前后缀。那么相应的,我就需要找到模式串里所有的公共前后缀。当然这些公共前后缀的长度会有所不同,又因为第一段里我说过模式串的指针需要移动到公共前缀后一个字符再尝试与主串匹配,那么模式串指针移动的终点与…当然会与匹配的公共前后缀长度相关。
这么一想,我又觉得认为“next数组中存储的是’当该字符不匹配时,对应的next数为 模式串指针应当传送至的模式串中的对应字符 的数组下标(数组下标从0开始)‘ ”仿佛可取,又或者“跳过”的说法和这个其个其实一样只是我没琢磨出来。主要是看的几个视频举的例子都符合我的这个思路,不知道是不是巧合,我也不敢确定我的思路一定可以推广到全部。是我走错路了也有可能。
果然…到底是怎么得来的next数组啊,为什么是这种方式实现的…果然是卡在了这里。
先睡觉吧