KMP还是难啊,连着搞了一晚上加一下午才勉强弄明白代码到底怎么实现。其实说到底他就是一个利用已配对字串降低时间复杂度的算法,但是用的方法太绕,以人的思维和逻辑不好理解。
kmp的第一步,构建next数组,这个构建next数组其实也要利用已配对字符串来降低时间复杂度
构建一个for循环用i指针遍历,一共有三种情况需要处理。第一种情况,i-1指向的数字为0,那我们现在就没有前缀可以使用了,只能是判断头部和尾部的单一字符是否相等,i指向的值只能为0或者1; 第二种情况,i-1指向的值不为0,那就说明我们有前缀了,判断左边指针前缀后边的字符是否和i字符相等,判断我们i要不要在i-1的基础上+1;第三种情况,在第二种情况的基础下,前后的两个不相等,比方说一个abab一个abac,那我们就找到前缀末尾的next值,用作i-1的next值,继续计算。真的绕死我了。。
函数主体,while循环总体判断条件是主链指针越界,因为我们要把副链指针越界当作return的条件。 有三种情况,第一种情况,i和j可以匹配,那就各自++;第二种情况,有前缀了,突然匹配不上,j转next数组;第三种情况,主链的开头就匹配不上,主链指针++。