KMP算法

参考:http://blog.csdn.net/v_july_v/article/details/7041827,其中的图表画得很好。

应用于:字符串匹配是计算机的基本任务之一。举例来说,有一个字符串"BBCABCDABABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD"?

KMP的算法步骤:

1.计算覆盖数组next[]

p:        a  b  a  a  b  c  a  b  a
next   -1 -1 0  0  1 -1 0  1  2

next[j]=-1表示没有前缀匹配,next[j]=k表示最大的前缀后缀间匹配长度是k+1

过程:

next[0]=-1
for i=1~len(p)-1
  if (next[i-1]==-1)
    p[i]与p[0]比较
      相等next[i]=0
      不相等next[i]=-1
  else p[i]与p[[i-1]+1]比较
    相等next[i]=next[i-1]+1
    不相等
      p[i]与p[0]比较
        相等next[i]=0
        不相等next[i]=-1

2.在字符串S中找p的首个匹配

过程:

i=0, j=0
while (i<len(S) && j<len(p))
  if (S[i]==p[j])//相同,比较下一个
    i++, j++
  else
    if (j==0)//S[i]与p[0]不同,只能继续比较S[i+1]和p[0]
      i++
    else
      j=next[j-1]+1//p[j]前面的p[0]~p[next[j-1]]是匹配的,因此从p[next[j-1]+1]继续下一步
if (j==len(p))
  return i-j
else 
  return -1

转载于:https://www.cnblogs.com/RoyCNNK/p/3353837.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值