KMP算法
字符串匹配中经常会用到KMP算法。它求解的问题类型是:字符串匹配。给你两个字符串,寻找其中一个字符串是否包含另一个字符串,如果包含,返回包含的起始位置。 我们一般的做法是:将一个字符串(长度为n,模式串)放在另一个字符串(长度为m,主串)开始的位置,然后依次比较,如果有不匹配的字符,就将字符串往后移一位,然后依旧从头开始比较。直到找到完全匹配的位置,返回。遍历顺序从0到m-n,每次遍历,都要比较n(最多)次,所以复杂度近似为O(m*n); 而我们今天说的这个KMP算法,可以达到O(m+n)的复杂度。 算法基本思想:每次当匹配失败时,没有必要就移动一位,因为前面可能有已经匹配的字符了。如果模式串当前的字符存在公共前后缀,那么我可以对于每一个模式串事先计算出模式串的内部匹配信息,在匹配失败时最大的移动模式串,以减少匹配次数。 注意最长前缀: 是说以第一个字符开始,但是不包含最后一个字符 KMP有个next数组,用来存放模式串中内部的匹配信息。举个例子,比如模式串为 ababaca ,长度是7,所以next[0],next[1],next[2],next[3],next[4],next[5],next[6]分别计算的是 a , ab , aba , abab , ababa , ababac , ababaca 的相同的最长前缀和最长后缀的长度。由于 a , ab , aba ,