目录
原文链接
朴素子字符串查找算法
KMP 算法是用来解决 子字符串查找 问题的算法,这个问题有一个很朴素(暴力)的解决方式,通常的写法是:
def bf_search(txt: str, pat: str) -> int:
i, j, txt_len, pat_len = 0, 0, len(txt), len(pat)
while i < txt_len and j < pat_len:
if txt[i] == pat[j]:
j += 1
else:
i -= j # 回退文本指针 i
j = 0 # 回退模式指针 j
i += 1
if j == pat_len:
return i - pat_len
return -1
当pat[j] 与 txt[i] 匹配失败后,i 会 显式的回退, 然后在 i+=1 的位置重新开始匹配
KMP 算法的基本思想
在模式指针在
j
处出现了不匹配的情况,那么,这个时候,文本字符串必然已经匹配了pat[0:j]
这部分模式字符串,此时,在朴素算法中, 我们会回退文本指针并在 右移一位 后继续尝试匹配模式字符串。
也就是说,接下来要尝试匹配的文本字符串是以
pat[1:j]
这个前缀开头的字符串,我们可以利用这一特性,避免重新匹配这个前缀。