(本文整理自讲义及自己的笔记,如有错误之处请指出)
注意:在本文中我们将使用始于零的数组来表示我们的字符串。所以在下面例子中,我们用S[2]
来表示字符串S
中的第三个字符。这种表示遵从C++语言的语法。
KMP算法可在一个主“文本字符串”S内查找一个“词”W的出现位置。此算法通过运用对这个词在不匹配时本身就包含足够的信息来确定下一个匹配将在哪里开始的发现,从而避免重新检查先前匹配的字符。
——摘自wikipedia
先来看看我们的问题:给出长度为 n 的字符串
容易想到暴力的做法:枚举 T 在
这种暴力做法的时间复杂度是多少呢?
我们知道,起始位置
我们可以分析一下暴力做法的效率为什么低:
S = aaaaaaaaaaaaaaaaaaab
T = aaaaab
这时候暴力做法没注意到 T1..4 和 T2..5