Spaces:
Runtime error
Runtime error
def compute_lps_array(sublist): | |
""" | |
计算模式串的最长前缀后缀匹配数组(LPS数组) | |
""" | |
lps = [0] * len(sublist) | |
j = 0 | |
i = 1 | |
while i < len(sublist): | |
if sublist[i] == sublist[j]: | |
j += 1 | |
lps[i] = j | |
i += 1 | |
else: | |
if j != 0: | |
j = lps[j - 1] | |
else: | |
lps[i] = 0 | |
i += 1 | |
return lps | |
def kmp_search(main_list, sublist, _start=0, _end=None, lps=None): | |
""" | |
使用KMP算法在列表上查找子串 | |
""" | |
if not sublist: | |
return 0 | |
if _end is None: | |
_end = len(main_list) | |
if lps is None: | |
lps = compute_lps_array(sublist) | |
i = _start # 指向主串的索引 | |
j = 0 # 指向子串的索引 | |
while i < _end: | |
if main_list[i] == sublist[j]: | |
i += 1 | |
j += 1 | |
if j == len(sublist): | |
return i - j | |
else: | |
if j != 0: | |
j = lps[j - 1] | |
else: | |
i += 1 | |
return -1 | |
if __name__ == '__main__': | |
a = [1, 1, 3, 2, 3, 6, 7, 8, 3, 2, 3] | |
b = [3, 2, 3] | |
c = compute_lps_array(b) | |
print(kmp_search(a, b, lps=c)) | |
print(kmp_search(a, b, 3, lps=c)) | |
print(kmp_search(a, b, 3, 10, lps=c)) | |
print(kmp_search(a, b, 9, lps=c)) | |