在计算机科学领域。AC字符串匹配算法是由和Margaret J. Corasick发明的字符串搜索算法。该算法应用有限自动机巧妙地将字符比较转化为了状态转移。此算法有两个特点,一个是扫描文本时完全不需要回溯,另一个是时间复杂度为O(n),时间复杂度与关键字的数目和长度无关。
直接实例分析吧。哈哈。
子字符串 {a, ab, bc, bca, c, caa}
建立状态机,哈哈。怎么建立。根据子字符串建立啊。白色为已经匹配到子字符串了。该输出了。
so。第一个节点是root节点。
节点 | 剩余字符串 | 输出:结束位置 | 变迁 | 输出 |
---|---|---|---|---|
() | abccab | 从root开始 | ||
(a) | bccab | a:1 | () 到子节点 (a) | 当前节点 |
(ab) | ccab | ab:2 | (a) 到子节点 (ab) | 当前节点 |
(bc) | cab | bc:3, c:3 | (ab) 到词尾(b) 到子节点(bc) | 当前节点, 词尾(等于输出c) |
(c) | ab | c:4 | (bc) 到后缀 (c) 到词尾 ()到子节点 (c) | 当前节点 |
(ca) | b | a:5 | (c) 到子节点 (ca) | 词尾(就是输出a) |
(ab) | ab:6 | (ca) 到词尾(a)到子节点 (ab) | 当前节点 |
源码实现:(自己找一下)