def get_next(str):
if len(str) == 0:
return []
if len(str) == 1:
return [-1]
next = [0 for _ in range(len(str))]
next[0] = -1
next[1] = 0
pre = 0
i=2
while i!=len(str):
if str[i-1] == str[pre]:
next[i] = pre + 1
pre += 1
i += 1
else:
if pre>0:
pre = next[pre]
else:
next[i] = 0
i += 1
return next
def kmp(a,b):
if (a == '') & (b ==''):
return 0
next = get_next(b)
i = 0
j = 0
while True:
if j == len(b):
return i-j
if i == len(a):
return -1
if a[i] == b[j]:
i += 1
j += 1
else:
if j != 0:
j = next[j]
else:
i += 1
print(kmp('aabaaabaaac','aabaaac'))
输出结果为4