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  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

你可能感兴趣的:(KMP算法)