标签:
/** * Created by cdpmac on 15/5/20. */ var mainstr="BCDABCADABCABACABCAB"; var substr= "ABCAB"; // //for(var i =0;i<mainstr.length;){ // //是否需要匹配子的下一位 // var next=true; // var subparindex=i; // for(var j =0;j<substr.length;){ // //匹配下一位。 // if(next){ // //如果匹配的项相同,则子和父都后移一位 // console.log(subparindex+‘‘+mainstr[subparindex]+j+substr[j]); // if(mainstr[subparindex]==substr[j]){ // subparindex++; // j++; // } // //如果匹配的不同,则不用匹配了。 // else{ // next=false; // j=substr.length; // } // } // } // i++; // if(next==true){ // console.log(‘get‘); // } // else{ // console.log(‘parent go next ‘+ i); // } //} //笨办法 //kmp算法就是利用 已知的匹配项信息,如上例,在index为9 处子 ABCABC已经匹配了 父的 ABCABD中ABCAB //基本办法,还是对父的ABCABD 移到了 第二个B项处。其实子已经匹配了父的ABCAB,我们确信父的对应位置也是ABCAB //我们可以取前后的相同位置这样移动 //基础 //BCDABCABDABCABCD // ABCABD //不成 //BCDABCABDABCABCD // ABCABD // ////KMP //BCDABCABDABCABCD // ABCABD //基础只移动一位 //kmp我们算算要移动几位 //匹配了ABCAB 5位。我们先往后5位。 //之后取已匹配项的头尾相同项,这里是两位AB // //BCDABCABDABCABCD // ABCABD //理想的情况是移到这里 //BCDABCABDABCABCD // ABCABD //实际为5-2; function getnextstep(arr){ var matchmax=0; var match=0; while(arr.length>1&&matchmax<arr.length/2){ var ismatch=true; for(var i=0;i<=matchmax;i++){ if(arr[i]!=arr[arr.length-1+i-matchmax]){ ismatch=false; break; } } if(ismatch){ match=matchmax; } //试着再多一位去匹配; matchmax++; } //则最大匹配个数+1(因为是从0算起); return match+1; } //console.log(getnextstep("ABBABB")); kmp(); function kmp(){ for(var i =0;i<mainstr.length;){ //是否需要匹配子的下一位 var next=true; var subparindex=i; var subindex=0; var j=0; for(;j<substr.length;){ //匹配下一位。 if(next){ //如果匹配的项相同,则子和父都后移一位 if(mainstr[subparindex]==substr[j]){ subparindex++; subindex++; j++; } //如果匹配的不同,则不用匹配了。 else{ next=false; j=substr.length; } } } var match=substr.substring(0,subindex); if(!match){ i++; } else{ console.log(match +‘ 子同项 ‘+getnextstep(match)); console.log(‘ 父移动到 ‘+(i+subindex-getnextstep(match))); j=getnextstep(match); i=i+(subindex+1)-getnextstep(match); } if(next==true){ console.log(‘get‘); } else{ console.log(‘parent go next ‘+ i); } } }
标签:
原文地址:http://www.cnblogs.com/zihunqingxin/p/4522971.html