KMP算法难点在于对于回溯的理解,回溯是字串与主串的存在不匹配时需要找到当前比较值之前字符串的最大公共前后缀,把字串前缀移动到后缀位置。在进行与当前值的比较,(这里对于最大公共前后缀的理解我理解错了,想半天弄不明白,为什么这种方法可以快速进行匹配。前后缀只能从头开始,不是说在字串中的部分连续并且有重复出现的字符串。理解了这个就能理解为什么要进行回溯匹配,前后缀相等,当前的部分字串与主串匹配因此,前缀后移可以保证前缀与主串匹配,并且改变字串原先不匹配的值在与主串中当前值进行重新匹配。)
next[j] = k;j代表当前值,k代表回溯位置。next数组里面的索引和值,代表了子串中当任何一个索引不匹配时需要回溯的位置。有了next数字提供的不匹配值对应的回溯位置。KMP算法完整思路就有了。
主串和字串相互各个位置相互匹配遇到不匹配的位置就使用next数组求出回溯位置再进行匹配,直到主串或者子串匹配位置超出索引(如果子串匹配未超出索引,主串超出索引代表主串中无子串,匹配失败。反之,子串超出索引匹配成功返回索引。),用子串最后匹配的位置值减去子串长度得到子串开始位置对应再主串中的索引并返回。
刚刚学习KMP不对的地方请大家指正,共同进步,感谢!