参考(35条消息) 字符串匹配算法综述_arthur.dy.lee的博客-CSDN博客
1. KMP算法:
"""
字符串匹配算法
"""
# 1. KMP算法
def kmp(mom, son):
next = nextarr(son)
i = j = 0
while i < len(mom) and j < len(son):
if mom[i] == son[j] or j == -1:
i += 1
j += 1
else:
j = next[j]
if j == len(son):
return i - j
return -1
def nextarr(s_str):
next_ls = [0] * len(s_str)
m = 1
s = 0
next_ls[0] = -1
while m < len(s_str) - 1:
if s_str[m] == s_str[s] or s == -1:
m += 1
s += 1
next_ls[m] = s
else:
s = next_ls[s]
return next_ls
mom_string = 'abcabcabd'
son_string = 'abcabd'
res1 = kmp(mom_string, son_string)
#res2 = sunday(mom_string, son_string)
print(res1)
2. sunday算法
# Sunday算法
def sunday(haystack, needle):
if not needle:
return 0
lnd = len(needle)
lnf = len(haystack)
if lnd > lnf:
return -1
# 偏移表预处理
dic ={v:lnd-k for k,v in enumerate(needle)}
idx = 0
while idx+lnd <= lnf:
# 待匹配字符串
str_cut = haystack[idx:idx+lnd]
# 判断是否匹配
if str_cut == needle:
return idx
elif idx+lnd == lnf:
return -1
else:
# 不匹配情况下,根据下一个字符的偏移,移动idx
nextc = haystack[idx+lnd]
idx += dic[nextc] if dic.get(nextc) else lnd+1
return -1
mom_string = 'abcabcabd'
son_string = 'abcabd'
res2 = sunday(mom_string, son_string)
print(res2)