起因
在牛客上做了一道KMP算法的题,按照我之前学习的代码进行计算发现结果是错误的,为了避免以后再次出现这样的问题,先把代码放上去,关于算法的设计以后看看再补上去。
后续
之前的代码并不是错误的,是因为答案中next数组的主程序和我之前代码的主程序不一样
我求的是next数组,并不是最长公共前缀后缀。下面的代码求得是next数组,例如
字符串 | a | b | a | b |
---|---|---|---|---|
next数组 | -1 | 0 | 0 | 1 |
公共前缀后缀数组 | 0 | 0 | 1 | 2 |
next数组代码
def Next(T):
i,j=0,-1
next=[-1]*len(T)
while i<len(T)-1:
if j==-1 or T[i]==T[j]:
i+=1
j+=1
next[i]=(j)
else:
j=next[j]
return next
print(Next('ababaaababaa'))
我们有了next数组,就可以写主程序进行匹配了.
def match(P,T):
i,j=0,0
next=Next(P)
while i<len(P):
#print(i,j)
if j==-1 or P[i]==T[j]:
i+=1
j+=1
else:
#i+=1
j=j-next[j]
if j==len(T):return 1
return 0