关于KMP里面next数组的算法貌似有多种解法:
1、规定任何一个串,next[1]=0(第一个的意思),next[j]就是第j个元素前j-1个元素首尾重合部分个数加一;详见
2、下面代码实现的,next[j]为以当前字符结尾的字符串的最长前后缀匹配长度。详见
#求next数组
def same_start_end(s):
n=len(s)
j=0 #前缀匹配指向
i=1 #后缀匹配指向
res=[0 for _ in range(n)]
while i<n:
if s[j]!=s[i] and j==0: #比较不相等并且此时比较的已经是第一个字符了
res[i]=0
i+=1
#比较不相等,将j值设置为j前一位的res中的值,为了在之前匹配到的子串中找到最长相同前后缀
elif s[j]!=s[i] and j!=0:
j=res[j-1]
elif s[j]==s[i]:
res[i]=j+1
j+=1
i+=1
return res
s='abaabcac'
print(same_start_end(s))
[0, 0, 1, 1, 2, 0, 1, 0]
s='aabbcc' #目标串
p='ab' #模式串
def kmp(s,p):
size_s=len(s)
size_p=len(p)
i=0
j=0
next=same_start_end(p)
while i<size_s:
if s[i]==p[j]:
i+=1
j+=1
if j>=size_p:
return i-size_p #返回匹配到的第一个字符串的第一个字符的索引
elif s[i]!=p[j]:
if j==0:
i+=1
else:
j=next[j]
if i==size_s:
return -1
print(kmp(s,p))
1
————————————————
积硅步,以致千里