def get_max_same_str(s):
"""
获取前后缀相同的最大长度
:param s: 要计算的字符串
:return:
"""
if len(s) == 1:
return 0
l = len(s)
i = l-1
j = 1
# 从最长前后缀开始比较,找到相等时直接返回
while i>=0 and j<l:
if s[:i] == s[j:]:
break
else: # 无相同字符串最终返回的i=0
i -= 1
j += 1
return i
def get_next(s):
"""
计算next数组
:param s:
:return:
"""
res_list = [-1]
for i in range(len(s)-1):
cur_str = s[:i+1]
if i==0:
res_list.append(0)
else:
res_list.append(get_max_same_str(cur_str))
return res_list
def kmp_search(source,patten):
len_source = len(source)
len_patten = len(patten)
if len_source<=1 or len_patten<=1:
print('source and patten length error')
return
next_list = get_next(patten)
i=0
j=0
while i<len_source and j<len_patten:
if source[i] == patten[j] or next_list[j]==-1:
i+=1
j+=1
else:
j=next_list[j]
if j == len_patten:
return i-j
else:
return
print(kmp_search('ababababca','bc'))
KMP算法(python实现)
最新推荐文章于 2023-12-29 07:54:30 发布