KMP算法(java實現)

next數組的求解:

求next數組的方法與這位大佬一樣,感興趣的同學自己去看吧。--->next數組的求解過程

代碼實現:

直接上根據這個方法我寫的kmp 

package suanfaTest;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class KMP01 {
    public static int i=0,j=0;
    public static int[] kmpNext(String ps){//Next數組
        List<Integer> nxt = new ArrayList<Integer>();
        int[] a = new int[ps.length()];//Next數組的長度爲模板串的長度
        int len = ps.length();
        if (len == 0){
            return null;
        }else if (len == 1){
            nxt.add(0);
            for (int i=0; i<nxt.size(); i++)
            {
                a[i] = nxt.get(i);
            }
            return a;
        }else if (len == 2){
            nxt.add(0);
            nxt.add(1);
           for (int i=0; i<nxt.size(); i++)
            {
                a[i] = nxt.get(i);
            }
            return a;
        }
        char[] p = ps.toCharArray();//將模式串轉換爲模式數組
        nxt.add(0);
        nxt.add(1);
        for (int i=2; i<p.length; i++){//採用由next(i-1)求next(i)的方法
            int k = nxt.get(i-1);
            while (k!=0){//當nxt.get(i-1)等於0時,代表已經回溯到了next數組的第一個元素
                if (p[i-1] == p[k-1]){//因爲數組是從0開始計數的,所以這裏需要k-1
                    nxt.add(k+1);
                    break;
                }else {
                    k = nxt.get(k-1);//p[k-1]與nxt.get(k-1)相對應
                }
            }
            if (k==0){
                nxt.add(1);
            }
        }
        for (int i=0; i<nxt.size(); i++)
        {
            a[i] = nxt.get(i);
        }
        return a;
    }
    public static Boolean KMP(String a,String b){
        int[] nxt = kmpNext(b);
        while (i<a.length()&&j<b.length()){
            if (a.charAt(i) == b.charAt(j)){//如果比較的兩位都相等的話,i++,j++
                i++;
                j++;
            }else if (j==0 &&a.charAt(i) != b.charAt(j)){//如果j=0,代表指向模式串的第一個元素,此時若比較的兩個元素不相等的話,則i++,j無需++
                i++;
            }else {
                j=nxt[j-1];//因爲我們的next數組下標是從0開始,所以這個地方是j-1,不然就是一個死循環
            }
        }
        if (j == b.length())
            return true;
        else
            return false;
    }
    public static void main(String args[]){
        String a = "hshabbbc";
        String b = "abbc";
        KMP01 kmp = new KMP01();
        System.out.println(kmp.KMP(a,b));
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章