- 设主串为T,匹配串为P
KMP算法的优点是通过证明了已匹配模式串子串的最大前后缀来保证模式串指针j可以不用回到初始位置,算法时间复杂度从O(lenT*lenP)简化成了O(lenT+lenP)
- 先从朴素算法开始,从T[0],P[0]扫描,可以发现第6个字符不匹配
- 设j是T串失配处的指针,也等于第一次失配成功部分的子串长度,下面要从该子串中找到更有效的部分。
考虑j的下一个位置:我们想要的是将j尽量往后移动,因为TGTG!=GTGT,GTG==GTG,TG!=GT,
第一次和第二次的公共串不相同,也就是第二次和T串的公共部分不相同,可以跳过这次匹配;而第三次和第一次的公共串相同,都是GTG,也就是第三次和T串的公共部分相同,
由于公共项都已经匹配成功,直接让j移动到GTG后的字符位置,而T串的指针i不用动,还是A这个位置。
所以大可不必进行朴素算法匹配,这样就得到了KMP算法
T:G T G T G
P