字符串匹配之KMP算法初探

原创 2013年12月05日 13:16:32

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


ACM-字符串-模式串匹配-KMP算法

KMP
  • u011787119
  • u011787119
  • 2016年01月17日 22:23
  • 1607

字符串匹配KMP算法初探

先来看基本的串的匹配算法。 给定一父串和一子串,判断子串是否匹配父串,匹配则返回父串开始匹配处的坐标,不匹配则返回-1.可配合下面的过程图看代码: #include #in...
  • kuzuozhou
  • kuzuozhou
  • 2012年09月05日 15:38
  • 472

字符串匹配KMP算法C++代码实现

看到了一篇关于《字符串匹配的KMP算法》(见下文)的介绍,地址:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93...
  • gdly2010
  • gdly2010
  • 2016年10月30日 10:21
  • 1635

史上最浅显易懂的KMP算法讲解:字符串匹配算法

KMP算法是一种改进后的字符串匹配算法,由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现,因此人们称它为克努特-莫里斯-普拉特操作(简称KMP算法)。 KMP算法又称“看毛片”算...
  • wangbaochu
  • wangbaochu
  • 2016年02月18日 20:32
  • 10216

蛮力法之串匹配问题---kmp算法中真/后缀作用及next数组计算

在源串S中搜索目标串T时,利用串匹配的暴力求解方法,在求解的过程中,我们分析得到简化该问题求解过程的关键步骤,也即kmp算法的核心思想:如何在某趟S[i]和T[j]匹配失败时,下标i不回溯,下标j回溯...
  • tterminator
  • tterminator
  • 2015年12月10日 00:19
  • 678

算法系列——字符串匹配朴素算法和KMP算法

字符串匹配算法主要是两类,最基本的暴力解法,也叫做朴素算法,另一种是KMP算法。本篇给出两种算法的最简单化的写法,便于面试时记忆和书写,当然重点还是理解其算法思想。朴素匹配算法被搜索的字符串称为主串,...
  • ylyg050518
  • ylyg050518
  • 2017年12月17日 15:24
  • 229

KMP字符串匹配(初学者必看,讲的很清晰)

从头到尾彻底理解KMP 首先声明一下,本博文转自July的博客,之前看了很多关于KMP算法的博客,发现都没讲清楚,但看了July的博客后,我就对KMP算法有了一个很清楚的...
  • luoshengkim
  • luoshengkim
  • 2015年03月29日 10:34
  • 3009

<C/C++算法>字符串匹配---KMP算法

KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配...
  • EbowTang
  • EbowTang
  • 2015年10月14日 19:14
  • 5878

KMP算法(字符串匹配算法)详解及java实现

KMP算法是BF(Brute Force)算法的一种改进算法,什么是BF算法这里不多做解释。 1.KMP算法实现思路:   每当一趟匹配过程中出现字符比较不等时,不需要回溯主串上面的指针i,而是...
  • syy0377
  • syy0377
  • 2013年12月16日 15:25
  • 4298

字符串匹配的KMP算法和朴素算法,及其python实现

KMP算法部分转载自阮一峰博客《字符串匹配的KMP算法》 原贴地址:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%...
  • chinwuforwork
  • chinwuforwork
  • 2016年07月18日 10:35
  • 1220
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:字符串匹配之KMP算法初探
举报原因:
原因补充:

(最多只允许输入30个字)