字符串匹配之KMP算法初探

按惯例AD下搜索易:http://www.i-ssy.com/ 

因为javascript无需编译可直接在浏览器执行,所以使用javascript编写,其他环境也一样的 稍作修改即可,优化了下代码,可以从指定位置开始查找


范例中的遍历查找所有字符串


执行结果:



代码:

function search(src,find,start){
	/// <summary>
	///	字符串匹配(KMP)
	/// </summary>
	/// <param name="src" type="String">原始字符串</param>
	/// <param name="find" type="String">要查找的字符串</param>
	/// <param name="start" type="Number">起始位置(默认为0)</param>
	/// <returns type="Number">返回匹配字符串的位置,不存在则返回-1</returns>
	if (typeof start !== "number" || start <0) {
		start = 0;
	}
	var lenSrc = src.length;
	var lenFind = find.length;
	if(lenFind<=lenSrc){
		src = src.split("");
		find = find.split("");
		var temp;
		lenSrc-=lenFind-1;
		for (var i = start; i < lenSrc; i++) {
			//初始化临时temp
			temp = 0;
			for(var j=0;j<lenFind;j++){				
				var charSrc = src[i+j];
				var charFind = find[j];
				if(charSrc===charFind){
					if(j==lenFind-1){
						return i;
					}
					else if(j>0){
						if(charSrc==src[i + temp]){
							temp +=1;
						}
						else{
							temp=0;
						}
					}else{
						temp=0;
					}
				}else{
						if(temp>0){
							//console.log 便于查看结果
							//console.log("start:" + i + " jump to " +  (i + j - temp) + " step " + (j - temp));
							//-1是因为 for循环下次会+1
							i+=(j - temp - 1);
						}
					break;
				}
			}
		}
	}
	return -1;
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值