KMP算法Python实现
问题由模式串匹配,不是由字符串匹配
Next数组:当模式匹配串失配之后,Next数组对应的元素指导应该用T串的哪个元素进行下一轮的匹配
失配时,模式串向右移动的位数为:
已经匹配的字符数 - 失配字符的上一位字符的最大长度值
失配字符所在位置 - 失配字符对应的next 值
参考以下博文:原文链接
def get_next(t):
next_list = [-2 for _ in range(len(t))]
next_list[0] = -1
i = 0
j = -1
while i < len(t) - 1:
if j == -1 or t[i] == t[j]:
i += 1
j += 1
next_list[i] = j
else:
j = next_list[j]
return next_list
def kmp(s, t):
next_list = get_next(t)
i, j = 0, 0
while i < len(s):
if j == -1 or s[i] == t[j]:
i += 1
j += 1
else:
j = next_list[j]
if j == len(t):
return i - len(t)
return -1
print(kmp("ababcababa", "ababa"))