《数据结构与算法》之KMP算法(15)

当然了,大家如果不熟悉的话,这么看我说这些道理,或者是看我写的代码也是难理解的,所以推荐大家看看《大话数据结构》这本书,这本书里面关于这个KMP算法讲得特别好,我如果再讲也是没人家说得好,所以这儿我就不说了,我只是随便讲讲原理,然后就给出代码。 

KMP算法:

Brute-Force被称为简单模式匹配算法KMP算法是它的改进算法。

一种改进的字符串匹配算法,由D.E.KnuthV.R.PrattJ.H.Morris同时发现,因此称之为KMP算法。此算法可以在O(n+m)的时间数量级上完成串的模式匹配操作,其基本思想是:每当匹配过程中出现字符串比较不等时,不需回溯指针,而是利用已经得到的“部分匹配”结果将模式向右“滑动”尽可能远的一段距离,继续进行比较。

 

计算模式串的next[j]

SiTj,若模式串存在最大真子串,可将模式串T按照k=next[j]的值向右滑动,然后比较SiTk,若仍有SiTk,则模式串T按照新的k=next[j]的值向右滑动后比较。这样的过程一直进行到k=next[k]=0,此时若SiT0,则模式串T不再向右滑动,随后比较Si+1T0

例如:主串为"aaaaaaab",

子串为"aaaab",求采用KMP的模式匹配过程。

模式          a   a   a   a   b

j               0   1   2   3    4

next[j]       -1  0  1   2     3

 

Kmp类:

package org.lixiyuan.kmp;

 

public class KMP {

    public static int[] Getnext(String sub){

        int i=1,j=0;

        int[] next=new int[sub.length()];

        next[0]=-1;

        next[1]=0;

        while(i<sub.length()-1){

            if(sub.charAt(i)==sub.charAt(j)){

               next[i+1]=j+1;

               i++;

               j++;

               

            }else if(j==0){//第一次匹配

               next[i]=0;

               i++;

               

            }else{

               j=next[j];

            }

            

        }

        return next;

    }

   

    public static int kmp(String old,String buf){

    //i是主串

    //j是子串

       inti=0,j=0,index=-1;

       int[] next=Getnext(buf);

       while(i<old.length()&&j<buf.length()){

           if(old.charAt(i)==buf.charAt(j)){

              i++;

              j++;

             

           }else if(j==0){//一切又重头

              i++;

           }else{

              j=next[j];

           }

          

       }

       if(j==buf.length()){

           index=i-j;

       }

       return index;

    }

 

    public static void main(String[] args) {

       int[]a=Getnext("abcabcaaa");

       for (int i = 0; i < a.length; i++) {

           System.out.println(a[i]);

       }

       int d=kmp("aaaaaaab","aaaab");

       System.out.println("%%%%%%%%%%%");

       System.out.println(d);

      

    }

 

}

测试结果:

-1

0

0

0

1

2

3

4

1

%%%%%%%%%%%

3

你可能感兴趣的:(《数据结构与算法》之KMP算法(15))