KMP算法理解
两个月之前彻底理解的KMP算法,为了准备九推机试,再复习一下
KMP的理解花了我很久的时间,这次重新复习,感觉又忘了很多内容,记录一下
进入正题
KMP算法的写法有很多,主要应当注意以下几点
- next[]的定义
- 字符数组的标号从0还是1开始
我的理解
按最普通的想法,匹配就不用说了,直接输出相应的匹配串的开始位置即可,失配的情况是i退到应当比较的下一个位置,j退回到最初位置
复杂度最坏情况是最后才匹配到i走一遍,j每一个i全走一遍,所以为O(n*m)
KMP算法的思想,也就是优化的地方就是:
失配了i也不动,j退回到自己应该的地方,j退回到正确的位置可以保证不漏解
应用
1.求循环节: 循环节长 = len - Next[len],一定要注意,必须是len - Next[len]
例:没有循环的时候必错,因为比 len 还小的数-Next[len]<len,而结果是 len
所以要注意,在求Next[]的时候,循环要(;i<len;)这样才能把Next[len]求到