数据结构与算法系列----AC自动机
一:概念 首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一。一个常见的例子就是给出n个单词,再给出一段文章(长度是m),让你找出有多少个单词在文章里出现过。要搞懂AC自动机,先得有字典树Trie的基础知识(也有人说需要KMP的知识,我觉得暂且不要理会这个。但是在看这篇文章之前,Trie字典树,你是必须要先搞懂,如果你还不理解Trie,请参考 http://blog.csdn.net/laojiu_/article/details/50838421 )。 与其他字符匹配不同,KMP算法是单模式串的字符匹配算法,AC自动机是多模式串的字符匹配算法。匹配时间复杂度是O(N),线性复杂度! 二:算法过程(三步走) 举个例子,假如现在给出5个模式串:say she shr he her 主串是:yasherhs 现在问你,这5个模式串有几个出现在主串里的? OK,现在就拿这个例子来完成这个算法的过程。 第一步: 构建Trie树,这很简单的了。构建好后,出现下图: 第二步: 构建失败指针 构建失败指针是AC自动机的核心所在,玩转了它也就玩转了AC自动机,失败指针就是,当我的主串在trie树中进行匹配的时候,如果当前节点不能再继续进行匹配,那么我们就会走到当前节点的fail节点继续进行匹配。