参考原出处:http://www.cnblogs.com/aaronjs/p/4225442.html
var str1 = "BBC ABCDAB ABCDABCDABDE";
var str2 = "ABCDABD";
var xx = this.KMP(str1, str2);
kmpGetStrPartMatchValue: function(str){
var prefix = [];
var suffix = [];
var partMatch = [];
var _len = str.length
for(var i = 0; i < _len; 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;
}
}
}
return partMatch;
},
KMP: 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 && part[j - 1] > 0){
i += (i - j - part[j - 1]);
}else{
//移动一位
i = i - j;
}
break;
}
}
if(result || result == 0){
break;
}
}
if(result || result == 0){
return result;
}else{
return -1;
}
}