主串与模式串匹配,关键在于主串不回溯,模式串进行特殊编码,对比与bf算法的异同
s="ababcabcabcacbab"
t="abcac"
#s="hasdefregrtshgtrhrthrth"
#t="hrthry"
#t="abcaababc"
slen=len(s)
tlen=len(t)
next=[0]*len(t)
def KMP():
i = 0
j = 0
o=0
while i < slen and j < tlen:
o+=1
#将next数组的首位设为-1
if s[i] == t[j] or j==-1:
i += 1
j += 1
#i,j对应字段不相等
else:
#获取编码
j = next[j]
print("O(x)=",o)
if j >= tlen:
return i - tlen
else:
return 0
"""
将模式串从头至尾与模式串从头至尾进行比较,对模式串进行编码
next函数关键
重点是
1.两个字段相等,i与j都增加
2.两个字段不等i==0,j增加
3.两个字段不等i!=0,i=0,不能错过j对应的字段与首位的比较
"""
#求next数组值
def getNext():
i=0
j=1
#
next[0]=-1
while j<len(t):
#print("j=",j)
#print("i=", i)
#print(next)
#判断是否相等,相等就都增加
if t[i]==t[j]:
#给过值,不在给值
if next[j]==0:
next[j] = i
i+=1
j+=1
#不相等,并且i等于0,
elif i==0:
if next[j] == 0:
next[j] = i
j += 1
#不相等,并且i不等于0,将i设为0,j不变,判断后面的字符是否与
elif i!=0:
if next[j] == 0:
next[j] = i
i=0
print(next)
getNext()
print(KMP())