转载地址:https://www.cnblogs.com/nullzx/news/2017/09/09/7497991.html

详情请参考转载地址,代码如下:

package string_alg;import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map.Entry;class AhoCorasickAutomation {/*本示例中的AC自动机只处理英文类型的字符串,所以数组的长度是128*/private static final int ASCII = 128;/*AC自动机的根结点,根结点不存储任何字符信息*/private Node root;/*待查找的目标字符串集合*/private List<String> target;/*表示在文本字符串中查找的结果,key表示目标字符串, value表示目标字符串在文本串出现的位置*/private HashMap<String, List<Integer>> result;/*内部静态类,用于表示AC自动机的每个结点,在每个结点中我们并没有存储该结点对应的字符*/private static class Node {/*如果该结点是一个终点,即,从根结点到此结点表示了一个目标字符串,则str != null, 且str就表示该字符串*/String str;/*ASCII == 128, 所以这里相当于128叉树*/Node[] table = new Node[ASCII];/*当前结点的孩子结点不能匹配文本串中的某个字符时,下一个应该查找的结点*/Node fail;public boolean isWord() {return str != null;}}/*target表示待查找的目标字符串集合*/public AhoCorasickAutomation(List<String> target) {root = new Node();this.target = target;buildTrieTree();build_AC_FromTrie();}/*由目标字符串构建Trie树*/private void buildTrieTree() {for (String targetStr : target) {Node curr = root;for (int i = 0; i < targetStr.length(); i++) {char ch = targetStr.charAt(i);if (curr.table[ch] == null) {curr.table[ch] = new Node();}curr = curr.table[ch];}/*将每个目标字符串的最后一个字符对应的结点变成终点*/curr.str = targetStr;}}/*由Trie树构建AC自动机,本质是一个自动机,相当于构建KMP算法的next数组*/private void build_AC_FromTrie() {/*广度优先遍历所使用的队列*/LinkedList<Node> queue = new LinkedList<Node>();/*单独处理根结点的所有孩子结点*/for (Node x : root.table) {if (x != null) {/*根结点的所有孩子结点的fail都指向根结点*/x.fail = root;queue.addLast(x);/*所有根结点的孩子结点入列*/}}while (!queue.isEmpty()) {/*确定出列结点的所有孩子结点的fail的指向*/Node p = queue.removeFirst();for (int i = 0; i < p.table.length; i++) {if (p.table[i] != null) {/*孩子结点入列*/queue.addLast(p.table[i]);/*从p.fail开始找起*/Node failTo = p.fail;while (true) {/*说明找到了根结点还没有找到*/if (failTo == null) {p.table[i].fail = root;break;}/*说明有公共前缀*/if (failTo.table[i] != null) {p.table[i].fail = failTo.table[i];break;} else {/*继续向上寻找*/failTo = failTo.fail;}}}}}}/*在文本串中查找所有的目标字符串*/public HashMap<String, List<Integer>> find(String text) {/*创建一个表示存储结果的对象*/result = new HashMap<String, List<Integer>>();for (String s : target) {result.put(s, new LinkedList<Integer>());}Node curr = root;int i = 0;while (i < text.length()) {/*文本串中的字符*/char ch = text.charAt(i);/*文本串中的字符和AC自动机中的字符进行比较*/if (curr.table[ch] != null) {/*若相等,自动机进入下一状态*/curr = curr.table[ch];if (curr.isWord()) {result.get(curr.str).add(i - curr.str.length() + 1);}/*这里很容易被忽视,因为一个目标串的中间某部分字符串可能正好包含另一个目标字符串,* 即使当前结点不表示一个目标字符串的终点,但到当前结点为止可能恰好包含了一个字符串*/if (curr.fail != null && curr.fail.isWord()) {result.get(curr.fail.str).add(i - curr.fail.str.length() + 1);}/*索引自增,指向下一个文本串中的字符*/i++;} else {/*若不等,找到下一个应该比较的状态*/curr = curr.fail;/*到根结点还未找到,说明文本串中以ch作为结束的字符片段不是任何目标字符串的前缀,* 状态机重置,比较下一个字符*/if (curr == null) {curr = root;i++;}}}return result;}public static void main(String[] args) {List<String> target = new ArrayList<String>();target.add("abcdef");target.add("abhab");target.add("bcd");target.add("cde");target.add("cdfkcdf");String text = "bcabcdebcedfabcdefababkabhabk";AhoCorasickAutomation aca = new AhoCorasickAutomation(target);HashMap<String, List<Integer>> result = aca.find(text);System.out.println(text);for (Entry<String, List<Integer>> entry : result.entrySet()) {System.out.println(entry.getKey() + " : " + entry.getValue());}}
}

python 复现AC自动机相关推荐

  1. Python——利用AC自动机进行关键词提取

    Python--利用AC自动机进行关键词提取 目标:在之前写的文章[Python实现多模匹配--AC自动机]基础上,安装gcc(C编译器),再装ahocorasick ,并完成从文本中提取关键词的任务 ...

  2. python实现AC自动机

    ac自动机可以看成带指针的字典树,每个节点的指针指向了当前节点的最大后缀的位置.在建立字典树后,可以层次遍历字典树来构建fail指针,根节点的直接孩子(第一层节点)的fail指针肯定是指向根节点的,之 ...

  3. Python实现多模匹配——AC自动机

    Python实现多模匹配--AC自动机 目标:学习AC自动机,多模匹配. 要求:尽可能用纯Python实现,提升代码的扩展性. 一.什么是AC自动机? AC自动机,Aho-Corasick autom ...

  4. python使用esmre代替ahocorasick实现ac自动机[多模匹配]

    Toggle navigation Home saltstack ansible zabbix docker python Golang web开发 运维开发 运维 文艺 python使用esmre代 ...

  5. AC自动机(python)

    AC自动机作为天朝发扬光大的算法,常用于非法字符.恶意文本匹配,比如把字符串中的"小学生"变成"***"之类,或是识别是不是违规的帖子之类的.AC自动机是基于前 ...

  6. KMP算法、AC自动机算法的原理介绍以及Python实现

    KMP算法 要弄懂AC自动机算法,首先弄清楚KMP算法. 这篇文章讲的很好: http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E ...

  7. 字符串匹配算法(AC自动机 Aho-Corasick)

    文章目录 1. 多模式串匹配 2. 经典多模式串匹配--AC自动机 2.1 AC自动机构建 2.2 在AC自动机上匹配主串 2.3 复杂度分析 3. python包 1. 多模式串匹配 前面学的BF. ...

  8. 数据结构与算法之美笔记——基础篇(下):图、字符串匹配算法(BF 算法和 RK 算法、BM 算法和 KMP 算法 、Trie 树和 AC 自动机)

    图 如何存储微博.微信等社交网络中的好友关系?图.实际上,涉及图的算法有很多,也非常复杂,比如图的搜索.最短路径.最小生成树.二分图等等.我们今天聚焦在图存储这一方面,后面会分好几节来依次讲解图相关的 ...

  9. 字符串算法 | AC自动机算法

    1.简介 一种多模式串匹配算法, 可以快速从主串中同时找出所有包含的所有模式串. 对比KMP是单模式匹配, 虽然可以使用单模式串匹配算法逐个进行查找模式串, 但是实际场景中,若模式串的数量可能很大,并 ...

最新文章

  1. 解题报告 poj 3207
  2. ASCII码八、十、十六进制对照表
  3. java异常不懂,看不懂的异常提示啊
  4. php ci框架结构,CI框架目录结构分析
  5. 库查询所有表的权限_JSW 基于WEB的MSSQL数据库查询平台
  6. Android ViewGroup
  7. jar包导出无法显示图片或者音乐_超详细微信表情包制作教程
  8. java clob 操作_java操作clob字段
  9. 图标和文字跟着div比例放大缩小_【方法技巧】高考地理越来越重视基本概念的考查,看高中地理如何考查比例尺的判读和应用,附专项练习...
  10. 如何设计更好的脉搏血氧仪:实施
  11. webqq机器人java_机器人之一步一步来做WebQQ机器人-(三)(登录QQ并保持在线)
  12. java淡蓝色怎么表示_最淡的蓝是什么颜色(淡蓝色配什么颜色好看)
  13. AutoStitch: a new dimension in automatic image stitching
  14. 小重山 【南宋】 岳飞
  15. 【工具使用】用高效的工具,完成高效的学习和科研
  16. 程序员们,国庆长假快乐呀!
  17. 当前不会命中断点还未为文档加载任何符号——问题探究
  18. spring学习总结(二)
  19. linux恢复移动硬盘数据恢复,移动硬盘文件误删后用数据恢复软件如何恢复
  20. 编译安装常用包+阿里镜像源-常用资源-系统-下载-科莱软件下载-docker仓库包-安全圈-杏雨梨云-图形界面安装...

热门文章

  1. linux mysql 没有密码忘记,在linux系统中,如果忘记了MySQL的root密码,有没有办法重新设置新密码呢?...
  2. IDEA中import自己的python包方法
  3. 【译】Part 1: 介绍和安装
  4. Segment Tree Beats 区间最值问题
  5. Ubuntu 源码方式安装Subversion
  6. NetApp集群模式Data ONTAP展露新颜
  7. Java_String
  8. Windows 7 任务栏开发 之 进度条(Progress Bar)
  9. 全新互联网四通手机震撼上市
  10. html word classid,html之object标签的classid收集