参考: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