|
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)) |
|
|