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