码迷,mamicode.com
首页 > 编程语言 > 详细

KMP算法

时间:2015-01-22 01:35:10      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:

1.字符串匹配

假设现在我们面临这样一个问题:有一个文本串S,和一个模式串P,现在要查找P在S中的位置,怎么查找呢?

举个例子,如果给定文本串S“BBC ABCDAB ABCDABCDABDE”,和模式串P“ABCDABD”,现在要拿模式串P去跟文本串S匹配,整个过程如下所示:

1. S[0]BP[0]A,不匹配,执行第②条指令:如果失配(即S[i]! = P[j]),令i = i - (j - 1)j = 0”S[1]P[0]匹配,相当于模式串要往右移动一位(i=1j=0

技术分享

2. S[1]P[0]还是不匹配,继续执行第②条指令:如果失配(即S[i]! = P[j]),令i = i - (j - 1)j = 0”S[2]P[0]匹配(i=2j=0),从而模式串不断的向右移动一位(不断的执行i = i - (j - 1)j = 0”i2变到4j一直为0

技术分享

3. 直到S[4]P[0]匹配成功(i=4j=0),此时按照上面的暴力匹配算法的思路,转而执行第①条指令:如果当前字符匹配成功(即S[i] == P[j]),则i++j++”,可得S[i]S[5]P[j]P[1],即接下来S[5]P[1]匹配(i=5j=1

技术分享

 4. S[5]P[1]匹配成功,继续执行第①条指令:如果当前字符匹配成功(即S[i] == P[j]),则i++j++”,得到S[6]P[2]匹配(i=6j=2),如此进行下去

技术分享

 5. 直到S[10]为空格字符,P[6]为字符Di=10j=6),因为不匹配,重新执行第②条指令:如果失配(即S[i]! = P[j]),令i = i - (j - 1)j = 0”,相当于S[5]P[0]匹配(i=5j=0

技术分享

6. 至此,我们可以看到,如果按照暴力匹配算法的思路,尽管之前文本串和模式串已经分别匹配到了S[9]P[5],但因为S[10]P[6]不匹配,所以文本串回溯到S[5],模式串回溯到P[0],从而让S[5]P[0]匹配。

技术分享

 

未完待续。。。 

KMP算法

标签:

原文地址:http://www.cnblogs.com/iakud/p/4240490.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!