def get_nextval(T):
'''
得到查找字符串自身每个字符对应的next值
next值指示不匹配时,主串i不变,而查找串从哪一项开始再进行对比
'''
nextval = [0 for i in T]
nextval[0] = -1
i = 0
j = -1
while i < len(T)-1:
if j == -1 or T[i] == T[j]:
i += 1
j += 1
if T[i] != T[j]:
nextval[i] = j
else:
nextval[i] = nextval[j]
else:
j = nextval[j]
return nextval
def kmp_index(S, T, pos):
i = pos
j = 0
nextval = get_nextval(T)
while i < len(S) and j < len(T):
if j == -1 or S[i] == T[j]:
i += 1
j += 1
else:
j = nextval[j]
if j >= len(T):
return i - len(T)
else:
return -1
print(kmp_index('ABCABCAAAAB', 'AB',0))