模式匹配算法以及KMP的javascript實現

暴力解決:
對主串的每一個字符作爲子串開頭,與要匹配的字符串進行匹配。對主串作大循環,每個字符開頭做T的長度的小循環,直到匹配成功或全部遍歷完爲止。

function Index(S,T) {
    var i=0;
    var j=0;
    while (i<S.length && j<T.length){
        if(S[i]==T[j]){
            ++i;
            ++j;
        } else {
            i=i-j+1;//i退回到上次匹配首位的下一位
            j=0;//j退回到子串T的首位
        }
    }
    if(j>=T.length){
        return i-T.length;
    } else {
        return -1;
    }
}

KMP模式匹配算法

  function getNext(T) {
        var next=new Array(T.length);
        var i=0;
        var j=-1;
        next[i]=j;
        while (i<T.length-1){
            if(j==-1 || T[i]==T[j]){
                i++;
                j++;
                next[i]=j;
            } else {
                j=next[j];
            }
        }
        return next;
    }
    function indexOf(S,T) {
        var i=0,j=0;
        var sLen=S.length;
        var tLen=T.length;
        var next=getNext(T);
        while (i<sLen && j<tLen){
            if(j==-1 || S[i]==T[i]){
                i++;
                j++;
            } else {
                j=next[j];
            }
        }
        if(j==tLen)
            return i-j;
        return -1;
    }

優化的KMP模式匹配算法

function getNext(T) {
    var tLen=T.length;
    var next=new Array(tLen);
    var k=-1;
    var j=0;
    next[0]=-1;
    while (j<tLen-1){
        if(k==-1 || t[j]==t[k]){
            k++;
            j++;
            if(t[j]!=t[k]){
                next[j]=k;
            } else {
                next[j]=next[k];
            }
        } else {
            k=next[k];
        }
    }
    return next;
}
發佈了95 篇原創文章 · 獲贊 22 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章