kmp字符串匹配算法

kmp字符串匹配算法

ID:33335556

大小:72.50 KB

页数:4页

时间:2019-02-24

kmp字符串匹配算法_第1页
kmp字符串匹配算法_第2页
kmp字符串匹配算法_第3页
kmp字符串匹配算法_第4页
资源描述:

《kmp字符串匹配算法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、KMP是一种著名的字符串模式匹配算法,它的名称来自三个发明人的名字。这个算法的一个特点就是,在匹配时,主串的指针不用回溯,整个匹配过程中,只需要对主串扫描一遍就可以了。因此适合对大字符串进行匹配。搜了网上很多KMP的代码下来调试,发现不是下标越界,就是死循环的,相当诡异...最后重新拿起严老师那本《数据结构》来翻,各种费解,有个地方用下标值和字符串下标0的元素做判断,更是诡异了...过了一天,忽然觉悟了。网上这些代码都是来自《数据结构》或者和他同源的版本的,而它使用的是以下标1为起始的字符串!对这种字符串组织格式,下标0存放的是字符串的长度。可是如今

2、主流的语言,几乎都是用的下标0作为起始,书本上的代码显然没法用,那就自己重写一个吧。 算法的原理字符串匹配嘛,无非就是两个指针,分别指向主串和模式串,然后依次往后移,检查是否一致。http://fzl.qqq80.com在遇到不能匹配的情况时(简称“失配”),一般的方法,就是让两个指针回溯,主串指针往后再移动一位,从头开始匹配。这其中做了很多重复劳动,我们可以分析一下:可以看到模式串在匹配到下标5时失配了。我们抓出模式串和主串在前方匹配的5个字符,并在模式串部分的前端和主串部分的后端找到了一对最长的相等的字串(不等于原来的串),用阴影标记一下,后面有

3、用。接着移动模式串,继续匹配:看出什么规律了么?每次比较,其实都是“abaab”的前端和后端的字串进行比较:第一回是"abaa"vs"baab"第二回是"aba"vs"aab"第三回是"ab"vs"ab"可见,只有在模式串部分的前端和主串部分的后端重合的时候,才可能继续匹配。是这样么?当然是的,因为我们之前找出的是最长的,相等的字串!这样就能把中间无效的对比步骤省略,主串的指针不变,模式串的指针直接跳到下标2继续匹配。这里的下标2就等于最长相等字串的长度。接着推广到更一般的情形:假设主串s,模式串patten,s和patten分别在下标i,j处失配,

4、如果j>0,那么,显而易见,'si-k...si-1'='patten0...pattenk-1',此串长度为k,故下一步模式串指针应当跳转到下标k继续匹配。在这里,http://youximingzhi.qqq23.com因为'si-k...si-1'= 'pattenj-k...pattenj-1',得到'patten0...pattenk-1'= 'pattenj-k...pattenj-1',所以给定patten和j的情况下,k的值也是固定的。如果j=0,那么i应当往后挪一位,j不变,重头匹配至此,对于给定的patten,可以得到一个j->k

5、的映射关系,记为数组next,其中,k=next[j]:next[j]=Max{k

6、0<=k

7、;int[]next=GetNext(patten);//待实现while(i

8、

9、s.charAt(i)==patten.charAt(j)){i++;j++;}else{j=next[j];//失配时跳转}}if(j==patten.length())//完全匹配returni-j;return-1;}这儿有一处很巧妙地的地方:next[0]是恒为-1的,所以如果在下标0处失配,则下一次循环j等于-1,i就会在循环中指向下一个字符,j也恢复为0。 模式串的next数组生

10、成算法看下面这张图假设模式串上的下标i,模式串下的下标j,那么显然next[5]=2是由patteni=4=pattenj=1推出的,推广到一般的情况,也就是说当patten与自身错位匹配时,当他们在i,j(i>j)处匹配时,此时可以得到next[i+1]=j+1如果j=0时就失配了的话,自然next[i+1]应当等于0至此,写出代码也就不难了,有些小技巧却要注意一下(Java代码):staticint[]GetNext(Strings){inti=0,j=-1;int[]next=newint[s.length()];next[0]=-1;//这个

11、初始化时必须的while(i

12、

13、s.charAt(i)==s.

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。