码迷,mamicode.com
首页 > 其他好文 > 详细

KMP

时间:2017-09-26 17:44:40      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:kmp   相等   span   pst   zha   开始   htm   ==   字符   

//求匹配串的最长前缀后缀数组
function getMax(str){
    var prefix=[]; //前缀
    var suffix=[]; //后缀
    var newMax=[]; //最长前缀后缀数组
    for(var i=0;i<str.length;i++){
        var tmpStr=str.substring(0,i+1);
        if(tmpStr.length==1){
            newMax[i]=0;
        }else{
            for(var k=0;k<i;k++){
                prefix[k]=tmpStr.slice(0,k+1);
                suffix[k]=tmpStr.slice(-k-1);
                //如果前后缀相等,则放进数组next中
                if(prefix[k]==suffix[k]){
                    newMax[i]=prefix[k].length;
                }
            }
            if(!newMax[i]){
                newMax[i]=0;
            }
        }
    }
    return newMax;
}

//s字符串,p模式串
function KMP(s,p){
    var max=getMax(p);
    var result;
    for(var i=0;i<s.length;i++){
        for(var j=0;j<p.length;j++){
            //如果匹配
            if(s[i]==p[j]){
                //如果匹配完成
                if(j==p.length-1){
                    result=i-j;
                    break;
                }else{
                    i++;
                }
            }else{
                if(j>1 && max[j-1]>0){
                    i+=(i-j-max[j-1]);
                }else{
                    //i回到开始匹配的位置
                    i=i-j;                       
                }
                break;
            }
        }
        if (result || result == 0) {
            break;
        }
    }
    if (result || result == 0) {
      return result
    } else {
      return -1;
    }
}


var s = "BBC ABCDAB ABCDABCDABDE";
  var p = "ABCDABD";
KMP(s,p);

参考链接:http://www.cnblogs.com/zhangtianq/p/5839909.html

KMP

标签:kmp   相等   span   pst   zha   开始   htm   ==   字符   

原文地址:http://www.cnblogs.com/wanghuohuo/p/7597502.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!