一个使用案例是从字符串B中查找字符串A的最长出现次数。例如,从字符串"stackoverflow"中查找"overdose"的最长出现次数将是"over"。你可以通过使用组合字符串"overdose#stackoverflow"(其中#是两个字符串中都不存在的字符)调用Z算法来发现这一点。然后,Z算法会尝试将组合字符串与自身进行匹配,并创建一个数组z[],其中z[i]给出从索引i开始的最长匹配长度。在我们的示例中:
index 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
string o v e r d o s e # s t a c k o v e r f l o w
z (21) 0 0 0 0 1 0 0 0 0 0 0 0 0 4 0 0 0 0 0 1 0
有很多代码实现和面向数学的算法解释,以下是一些很好的例子:
http://www.geeksforgeeks.org/z-algorithm-linear-time-pattern-searching-algorithm/ http://codeforces.com/blog/entry/3107
我知道这个算法怎么工作,但是我不理解为什么。它似乎几乎像黑魔法一样。我非常强烈地感觉这个任务应该需要O(n^2)
的时间,然而这里却有一个只需要O(n)
的算法。