@wzhang1117
2014-08-17T13:41:07.000000Z
字数 2024
阅读 6918
算法
KMP
KMP算法是一种快速模式匹配算法,其中最关键的部分是根据模式串生成next数组。
设模式串为
这种方法的主要思路是根据next数组的定义将k从j-1到0暴力尝试,判断是否存在对应的序列。
def ViolateGetNext(p):
plen = len(p)
n = [-1]*plen
for j in range(1,plen):
k = j - 1
while k > 0:
#如果存在长度为k的相同前缀和后缀
if p[:k] == p[j-k:j]:
break
k -= 1
#如果不存在这样的k,k此时为0
n[j] = k
return n
设模式串为
暴力求解每次在计算
设模式串为
1.
2.如果
3.如果
4.
5.将
def ReGetNext(p,j):
if j == 1:#j指示字符串的长度
return [-1]
#计算p前1到j-1个字符的next数组
n = ReGetNext(p,j-1)
k = n[j-2]
while k != -1:
if p[j-2] == p[k]:
break
k = n[k]
#k+1为第j个字符next值
n.append(k+1)
return n
设模式串为
这种方法和递归的思路类似,但是不如递归清晰。
def GetNext(p):
plen = len(p)
n = [-1]*plen
k = -1
j = 0
while j < plen -1:
if k == -1 or p[j] == p[k]:
j += 1
k += 1
n[j] = k
else:
k = n[k]
return n
计算next数组的关键还是在于彻底理解其含义。通过next数组的数学定义可以很容易的得到一个暴力解法,这个方法思路最清晰,第二种递归则是利用了next数组前后的关系得到了一个效率更高的算法,第三种和第二种类似,减少了递归调用。以模式串