def get_next_list(s):
next_list = [0]*len(s)
for i in range(len(s)):
if i == 0:
next_list[i] = 0
else:
for k in range(0, i):
if s[0: k] == s[i - k: i]:
next_list[i] = max(next_list[i], k+1)
if next_list[i] == 0:
next_list[i] = 1
return next_list
# str_list = ['abcdex', 'abcabx', 'ababaaaba', 'aaaaaaaab']
# for src_str in str_list:
# print(get_next_list(src_str))
# 1. 朴素模式匹配算法
def index_sub_list(src_str, target_str):
i, j = 0, 0
while i < len(src_str) and j < len(target_str):
if src_str[i] == target_str[j] :
i +=1
j +=1
else:
i = i - j + 1
j = 0
if j >= len(target_str):
return i - len(target_str)
else:
return -1
# 2. kmp匹配算法
def kmp_index_sub_list(src_str, target_str):
i, j = 0, 0
target_next = get_next_list(target_str)
while i < len(src_str) and j < len(target_str):
if src_str[i] == target_str[j]:
i += 1
j += 1
elif j!=0:
j = target_next[j-1]
else:
i += 1
if j >= len(target_str):
return i - len(target_str)
else:
return -1