def kmp(s,t):
lens = len(s)
lent = len(t)
if lens < lent:
return -1
i=0
j=0
newlist = [-1 for i in range(lent)]
getNext(t,newlist)
while i < lens:
if j == -1 or s[i] == t[j]:
i = i+1
j = j+1
else:
j = newlist[j]
if j==lent:
return i-lent
return -1
'''方法getNext获得待匹配字符串的数组''' 方法1
def getNext(s,newlist):
j = 0
k = -1
newlist[0] = -1
while j<len(s)-1:
if k == -1 or s[k] == s[j]:
k += 1
j += 1
newlist[j] = k
else:
k = newlist[k]
#方法二实现KMP
def KMP(s,p):
l = len(s)
m = len(p)
F = [-1 for i in range(m)]
getNext(p,F)
print(F)
i=0
j=0
while i<l:
if(s[i] == p[j]):
i += 1
j += 1
if j == m:
print('在%d处匹配'% (i-m+1))
j = F[j-1] + 1
else:
if j == 0:
i += 1
else:
j = F[j-1] + 1
def getNext(s,F):
l = len(s)
for i in range(1,l):
j = F[i-1]
while s[i]!=s[j+1] and j>=0:
j = F[j]
if s[i] == s[j+1]:
F[i] = j+1
else:
F[i] = -1