KMP算法的JavaScript实现

  刚才看到新闻频道转截的一篇文章:阮一峰:字符串匹配的KMP算法,图文并茂通俗易懂,就用JS实现了一下,现分享出来。

  算法的核心是部分匹配表和回退算法,部分匹配表的实现如下:

function kmpGetStrPartMatchValue(str) {

    var prefix = [];

    var suffix = [];

    var partMatch = [];

    for(var i=0,j=str.length;i<j;i++){

        var newStr = str.substring(0,i+1);

        if(newStr.length == 1){

            partMatch[i] = 0;

        } else {

            for(var k=0;k<i;k++){

                prefix[k] = newStr.slice(0,k+1);

                suffix[k] = newStr.slice(-k-1);

                if(prefix[k] == suffix[k]){

                    partMatch[i] = prefix[k].length;

                }

            }

            if(!partMatch[i]){

                partMatch[i] = 0;

            }

        }

    }

    prefix.length = 0;

    suffix.length = 0;

    return partMatch;

}



//demo

var t="ABCDABD";

console.log(kmpGetStrPartMatchValue(t));

//output:[0,0,0,0,1,2,0]

  回退算法实现如下:

function KMP(sourceStr,targetStr){

    var partMatchValue = kmpGetStrPartMatchValue(targetStr);

    var result = false;

    for(var i=0,j=sourceStr.length;i<j;i++){

        for(var m=0,n=targetStr.length;m<n;m++){

            if(str.charAt(m) == sourceStr.charAt(i)){

                if(m == targetStr.length-1){

                    result = true;

                    break;

                } else {

                    i++;

                }

            } else {

                if(m>0 && partMatchValue[m-1] > 0){

                    m = partMatchValue[m-1]-1;

                } else {

                    break;

                }

            }

        }

        if(result){

            break;

        }

    }

    return result;

}

var s = "BBC ABCDAB ABCDABCDABDE";

var t = "ABCDABD";

console.log(KMP(s,t));

//output: true

  欢迎交流讨论。

你可能感兴趣的:(JavaScript)