尽管我回答这个问题有点迟了,但是我认为Z-Algorithm
它比其他任何同行都快。其最坏情况下的复杂度为O(m + n),并且不需要对模式/文本进行预处理。与其他算法相比,编码也非常容易。
它以以下方式工作。
例如,有一个字符串S ='abaaba'
。我们将寻找的z(i)
价值i=0 to len(S)-1
。在进行解释之前,让我先列出一些定义。
z(i)
=不。的前缀的字符与的前缀S
匹配s(i)
。
s(i)
=的ith
后缀S
。
以下是的s(i)
值s = 'abaaba'
。
s(0) = 'abaaba' = S
s(1) = 'baaba'
s(2) = 'aaba'
s(3) = 'aba'
s(4) = 'ba'
s(5) = 'a'
z值分别是
z(0) = 6 = length(S)
z(1) = 0
z(2) = 1
z(3) = 3
z(4) = 0
z(5) = 1
要详细了解该算法,请参考以下链接。
http://codeforces.com/blog/entry/3107
https://www.youtube.com/watch?v=MFK0WYeVEag
现在,需要O(N)来查找所有z
值,而无需任何预处理开销。有人会怀疑现在如何使用这种逻辑来匹配给定字符串中的模式?
让我们看一个例子。模式(P): aba
,文本(T): aacbabcabaad
。
以P $ T的形式输入。($
-任何没有出现在图案或文本中的字符。我稍后会谈到它的重要性$
。)
P$T
= aba$aacbabcabaad
我们知道len(P)
= 3。
的所有z值P$T
是
z(0) = 16 = len(P$T)
z(1) = 0
z(2) = 1
z(3) = 0
z(4) = 1
z(5) = 1
z(6) = 0
z(7) = 0
z(8) = 2
z(9) = 0
z(10) = 0
z(11) = 3
z(12) = 0
z(13) = 1
Z(14) = 1
Z(15) = 0
现在哪个z(i)
= len(P)
。Ans = 11.
因此我们的模式出现在Ans-len(P)-1
= 7
。-1
是为了$
品格。
现在为什么$
或任何这样的特殊字符很重要。考虑P = 'aaa'
和T = 'aaaaaaa'
。没有特殊字符,所有z(i)
值都将具有增量值。仍然可以使用以下公式找到图案在文本中的位置:
条件:z(i)
> = len(P)
和位置:Ans-len(P)
。但是这种情况下的情况变得有些棘手和令人困惑。我个人更喜欢使用特殊字符技术。