def getNextArr(s2):
nextarr = [0,]
i = 1;
length = 0;
while i < len(s2):
# 如果有共同前后缀
if s2[length] == s2[i]:
length += 1;
nextarr.append(length);
i += 1;
# 如果没有共同前后缀,查上一个字符的共同前后缀长度是多少
else:
length = nextarr[length - 1];
if length == 0:
nextarr.append(0);
i += 1;
return nextarr
#串s1 子串s2
def KMP(s1,s2):
nextarr = getNextArr(s2);
i = 0;
j = 0;
while(i < len(s1)):
if s1[i] == s2[j]:
i += 1
j += 1
if j == len(s2):
return i - j;
elif j == 0: # 第一个匹配失败,直接往下走
i += 1
else:
j = nextarr[j - 1]
return -1;
print getNextArr("ABACABAB")
print KMP("ABABABACABABAC","ABACABAB")
04-06
1019
11-16
184
06-01
1764