转自:http://www.cnblogs.com/aaronjs/p/4225442.html
<pre name="code" class="javascript"> var str1 = "BBC ABCDAB ABCDABCDABDE";
var str2 = "ABCDABD";
var yy = this.KMP2(str1, str2);
KMP2: function(sourceStr, searchStr){
//生成匹配表
//var part = this.kmpGetStrPartMatchValue(searchStr);
var sourceLen = sourceStr.length;
var searchLen = searchStr.length;
var result;
var i = 0, j = 0;
for(; i < sourceLen; i++){ //最外层循环,主串
//子循环
for(var j = 0; j < searchLen; j++){
//如果与主串匹配
if(searchStr.charAt(j) == sourceStr.charAt(i)){
//如果是匹配完成
if(j == searchLen - 1 ){
result = i - j;
break;
}else{
//如果匹配到了就继续循环,i++是用来增加主串的下标位
i++;
}
}else{
//在子串的匹配中i是被叠加了
if(j > 1){
var tmpData = this.nextKmpGet(searchStr.slice(0,j));
i += i - tmpData;
}else{
//移动一位
i = i - j;
}
break;
}
}
if(result || result == 0){
break;
}
}
if(result || result == 0){
return result;
}else{
return -1;
}
},
nextKmpGet: function(str){
var prefix = [];
var suffix = [];
var partMatch;
var i = str.length;
var newStr = str.substring(0, i+1);
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 = prefix[k].length;
}
}
if (!partMatch) {
partMatch = 0;
}
return partMatch;
},