按惯例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;
};