KMP算法总结

目录

什么是KMP

什么时候用KMP算法解决问题 

什么是前后缀 

什么是前缀表(next数组) 

构造next数组 


什么是KMP

因为是由这三位学者发明的:Knuth,Morris和Pratt,所以取了三位学者名字的首字母。所以叫做KMP

什么时候用KMP算法解决问题 

KMP主要应用在字符串匹配上(判断一个字符串是否包含另一个字符串)。KMP的主要作用是当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头再去做匹配了。

所以如何记录已经匹配的文本内容,是KMP的核心,KMP算法用一个next数组记录最长相等前后缀的长度。

什么是前后缀 

前缀:包含首字母,不包含尾字母的所有子串。比如“abcde”的前缀有“a”,“ab”,“abc”,“abcd”。

后缀:包含尾字母,不包含首字母 的所有子串。“abcde”的后缀有“e”,“de”,“cde”,“bcde”。

什么是前缀表(next数组) 

前缀表记录了当前当前下标之前的字符串只能怪,最长相等前后缀的长度。前缀表是用来回退的,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。

比如:aabaaf对应的前缀表为[0,1,0,1,2,0]

a  没有前后缀   0

aa 前后缀都是a   1

aab  前缀有  a  aa,后缀有  b  ab    最长相等前后缀为 0

aaba  同理为1

aabaa  2

aabaaf   0

构造next数组 

构造next数组主要有四步:

  1. 初始化
  2. 前后缀不相等
  3. 前后缀相等
  4. 更新next数组
public static void getnext(int[] next,String needle){
        //初始化
        int j=0; //j代表前缀末尾位置,也是最长相等前后缀的长度
        next[0]=0;
        for(int i=1;i0 && needle.charAt(i)!=needle.charAt(j)){
                j=next[j-1];  //回退
            }
            // 当前后缀相等时
            if(needle.charAt(i)==needle.charAt(j)){
                j++;
            }
            next[i]=j;  //更新next数组
        }
    }

以上就是我对KMP算法的理解,上一篇博客写了KMP算法是具体应用,大家可以来练习一下。

你可能感兴趣的:(算法,microsoft,sqlserver,java,数据结构)