js实现kmp算法_基于KMP算法JavaScript的实现方法分析

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

function kmpGetStrPartMatchValue(str) {

var prefix = [];

var suffix = [];

var partMatch = [];

for(var i=0,j=str.length;i

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

if(newStr.length == 1){

partMatch[i] = 0;

} else {

for(var k=0;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

for(var m=0,n=targetStr.length;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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值