kpm字串匹配演算法

來源:互聯網
上載者:User

標籤:位置   角度   blog   分享   字串匹配   static   array   字串首碼   index   

首先是簡單的樸素匹配演算法

    /*     * 返回子串t在主串s的位置,若不存在則返回0     */    public static int index(String s, String t) {                int i = 0;//i記錄主串當前位置的下標        int j = 0;    //j記錄子串當前位置的下標                char[] c = t.toCharArray();        char[] d = s.toCharArray();        while(i < s.length() && j < t.length()) {            if(c[i] == d[j]) {                i++;                j++;                if(j == t.length()) {                    break;                }            }else {                i = i - j;//如果不匹配i退回到上次匹配首位的下一位                j = 0;            }        }        if(j == t.length()) {            return i - j + 1;        }        return 0;    }

舉例說明:

s是 abcabcabd t是 abcabd,樸素的匹配演算法每次發現不對都要重新回到上次匹配的首位,也就是要重新在s從找一次t的和第一個字元匹配的字元。

但是像這個例子t字串中一開始就有ab後面也有ab,也就是說如果匹配到最後一位發現不匹配的時候,就可以直接進行到這裡

所以這就是kmp改進的地方,先自行處理一下t字串,找到t字串中與首碼有重複的。建立一個next數組記錄下這個重複,就比如這個t匹配到最後一個時發現s[5]和t[5]匹配失敗,但是t[3]t[4]和t[1]t[2]是重複的,所以這裡可以直接進行s[5]和t[3]的匹配。從代碼的角度講就是當i=5,j=5時,s[i]和t[j]匹配失敗,那就修改j跳過之前與t字串首碼重複的。

這是一個next數組,這裡j=0時沒有首碼所以在匹配的時候就應該重t[0]開始匹配,j=1時首碼是a但是t[1]是b所以沒有重複,所以還是0,一直到j=3,a和首碼a重複所以所以在匹配的時候就應該重t[1]開始匹配,到j=4,ab和首碼ab重複所以所以在匹配的時候就應該重t[2]開始匹配,j=5的時候abd和首碼abc並沒有重複所以應該重t[0]開始匹配。

再然後就是這個next數組怎麼計算。。

聲明一個k初始化為0用於記錄首碼被重複的長度了,就比如t[3]和t[0]重複就記1,此時next[]相應的位置就是1(k),t[3]t[4]和t[0]t[1]重複就記2,此時此時next[]相應的位置就是2(k),t[3]t[4]t[5]t[0]t[1]t[3不]重複就置0。

整體代碼:

public static int KmpIndex(String s, String t) {        int i = 0;        int j = 0;    //j記錄子串當前位置的下標        int[] next = new int[t.length()];        char[] c = t.toCharArray();        char[] d = s.toCharArray();        int k = 0;                while(j < t.length()) {            if(k == 0 && j == 0) {                //第一個字元的前尾碼為空白                next[j++] = 0;            }else {                //使用k來記住已經和前者匹配到那個位置了                if(k == 0 ) {                    //k=0 就是上一個未匹配                    if(c[k] != c[j]) {                        //不相等就是不匹配                        next[j++] = 0;                    }else {                        //相等就是匹配,next[j]等於k+1,然後增加k和j的值                        next[j++] = ++k;                    }                }else {                    //k!=0 就是上k個都已經匹配了                    if(c[k] != c[j]) {                        //不相等就是不匹配而且之後要重頭匹配 k=0                        next[j++] = 0;                        k = 0;                    }else {                        //相等就是匹配,next[j]等於k+1,然後增加k和j的值                        next[j++] = ++k;                    }                }            }        }        j = 0;        while(i < s.length() && j < t.length()) {            if(d[i] == c[j]) {                i++;                j++;                if(j == t.length()) {                    break;                }            }else {                j = next[j];            }        }        if(j == t.length()) {            return i - j;        }        return 0;    }

 

kpm字串匹配演算法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.