KMP算法

前提1:模式串pattern和目标串target都是从第0位开始存储字符的。

前提2:next[j-1]:存储了当Pj元素(第j+1个字符)首先与target不匹配时(令k=next[j-1]),P0......j-1  这个元素的最长公共子前缀(length-1), 也意味着target[i]下次应该与 Pnext[j-1]+1比较。

假设P0与P1都与模式串匹配,且target[i]本次与P2不匹配,next[1]=-1+1=0 (注:next[0]=-1);因此模式串右移1个字符,下次target[i]应该与第(子前缀长度+1)个字符比较,该字符下标为:子前缀长度。因此新的index=子前缀长度=next[j-1]+1;

公式化:计算next[j]  时,比较公共前缀如下(注:令k=next[j-1]):当前需要比较的字符为:Pj  和 Tk+1

P0P1......Pj-k......Pj-1     Pj.......

                              T0........Tk        Tk+1......

k=next[j-1],意味着当Pj是不匹配target[i]的first元素时,P[0,1......j-1]中公共子前缀长为k+1,即P[j-k.....j-1]和T[0....k]。

:计算next[j]时,Pj+1是首个不匹配元素。


1、如果Tk+1=Pj,则P[0......j]这j+1个元素中,T[0......k+1]=P[j-k......j],所以最长元素子前缀长=k+2,所以Next[j]=k=2-1=k+1=Next[j-1]+1

2、如果Tk+1 !=Pj,则只能在在Pj-k.....Pj-1这k个元素中寻找公共子前缀。由于T0......k=Pj-k....j-1,所以问题转化为:T0....k的公共子前缀长度-1,即当Pk+1是首个不匹配元素时,T[0......k] 这些元素的公共子缀长-1,即为next[k],此时next[j]=next[k]=next[next[j-1]]。

3、举例说明:新的与target[i]比较的元素是第(前缀长度+1)个元素。

      3.1    ab是前缀

abab  p剩余字符

                    ab  t剩余字符

      3.2     ab是前缀

                abcab  p剩余字符

      ab  t剩余字符

      3.3      abc是前缀

                 abcabc   p剩余字符

                       abc   t剩余字符



你可能感兴趣的:(LeetCode笔记)