AC自动机, 字符串匹配算法
package utils
import java.util.HashMap
import java.util.LinkedList
import util.control.Breaks._
import collection.JavaConversions._
class NodeAc {
var children = new HashMap[Char, NodeAc]
var isLeaf: Boolean = false
var value: Char = ' '
var fail: NodeAc = null
}
object AhoCorasickAutomation {
var root: Option[NodeAc] = Option(new NodeAc())
def buildTrie(words: String) {
if (words == null || words.isEmpty) {
return
}
var current: NodeAc = root.get
val chars: Array[Char] = words.toCharArray
var i: Int = 0
for (i <- 0 to (chars.length - 1)) {
val currentChildren = current.children
if (!currentChildren.containsKey(chars(i))) {
currentChildren.put(chars(i), new NodeAc)
currentChildren.get(chars(i)).value = chars(i)
}
if (i == chars.length - 1) {
currentChildren.get(chars(i)).isLeaf = true;
}
current = currentChildren.get(chars(i))
}
}
def buildACFromTrie: Unit = {
var queue: LinkedList[NodeAc] = new LinkedList[NodeAc]()
queue.add(root.get)
while (!queue.isEmpty) {
val parent: NodeAc = queue.poll()
var temp: NodeAc = null
for (child: NodeAc <- parent.children.values()) {
if (parent == root.get) {
child.fail = root.get
} else {
temp = parent.fail
breakable {
while (temp != null) {
var node: NodeAc = temp.children.get(child.value)
if (node != null) {
child.fail = node
break()
}
temp = temp.fail
}
}
if (temp == null) {
child.fail = root.get
}
}
queue.add(child)
}
}
}
def containDictionaryWord(words: String): Boolean = {
var current: NodeAc = root.get
val chars: Array[Char] = words.toCharArray
for (i <- 0 to (chars.length - 1)) {
while (current.children.get(chars(i)) == null && current != root.get) {
current = current.fail
}
current = if (current.children.get(chars(i)) == null) root.get else current.children.get(chars(i))
if (current != root.get && current.isLeaf) {
return true
}
}
false
}
}
AC自动机, 字符串匹配算法的更多相关文章
- 【学习笔记】ac自动机&fail树
定义 解决文本串和多个模式串匹配的问题: 本质是由多个模式串形成的一个字典树,由tie的意义知道:trie上的每一个节点都是一个模式串的前缀: 在trie上加入fail边,一个节点fail边指向这个节 ...
- 多模字符串匹配算法之AC自动机—原理与实现
简介: 本文是博主自身对AC自动机的原理的一些理解和看法,主要以举例的方式讲解,同时又配以相应的图片.代码实现部分也予以明确的注释,希望给大家不一样的感受.AC自动机主要用于多模式字符串的匹配,本质上 ...
- 【字符串算法】AC自动机
国庆后面两天划水,甚至想接着发出咕咕咕的叫声.咳咳咳,这些都不重要!最近学习了一下AC自动机,发现其实远没有想象中的那么难. AC自动机的来历 我知道,很多人在第一次看到这个东西的时侯是非常兴奋的.( ...
- 字符串处理-AC自动机
估计在OJ上刷过题的都会对AC自动机这个名词很感兴趣,同样,记得去年ACM暑期集训的时候,在最后讲到字符串部分,听说了这个算法的名字之后就对于它心向往之,AC正好是Accept的简称,字面意义上的理解 ...
- hdu 2296 aC自动机+dp(得到价值最大的字符串)
Ring Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- Aho-Corasick 多模式匹配算法、AC自动机详解
Aho-Corasick算法是多模式匹配中的经典算法,目前在实际应用中较多. Aho-Corasick算法对应的数据结构是Aho-Corasick自动机,简称AC自动机. 搞编程的一般都应该知道自动机 ...
- 【专题】字符串专题小结(AC自动机 + 后缀自动机)
AC自动机相关: $fail$树: $fail$树上以最长$border$关系形成父子关系,我们定一个节点对应的串为根到该节点的路径. 对于任意一个非根节点$x$,定$y = fa_{x}$,那$y$ ...
- pku1204 Word Puzzles AC自动机 二维字符串矩阵8个方向找模式串的起点坐标以及方向 挺好的!
/** 题目:pku1204 Word Puzzles 链接:http://poj.org/problem?id=1204 题意:给定一个L C(C <= 1000, L <= 1000) ...
- 2017ACM暑期多校联合训练 - Team 8 1006 HDU 6138 Fleet of the Eternal Throne (字符串处理 AC自动机)
题目链接 Problem Description The Eternal Fleet was built many centuries ago before the time of Valkorion ...
随机推荐
- springboot 常用插件
热部署 使用run as -java application, 把spring-loader-1.2.4.RELEASE.jar下载下来,放到项目的lib目录中,然后把IDEA的run参数里VM参数设 ...
- Pascal的3种注释
1.单行注释 {大括号里的内容都被注释掉} 2.单行注释2 //这种注释几乎是绝大部分语言中通用的了 3.多行注释 (*pascal的多行注释有点奇怪,使用的是:括号+星号的方式*) 其他 ...
- C语言中函数返回字符串的四种方法
在讨论着四种方法之前,首先要对函数有一个简单的认识,无论是在形实结合时,还是在return语句返回时,都有一个拷贝的过程.你传进来的参数是个值,自然函数在工作之前要把这个值拷贝一份供自己使用,你传进来 ...
- JAVA 之 多态 抽象 接口
一:多态 1:多态 一个对象有多种形式的能力 2:步骤 1编写父类派生子类 2子类重写父类方法 3用父类的数据类型引用子类对象 3:静态多态的实现方式就是方法重载 4:动态多态的实现方式就是重写 ...
- rvm is not a function的解决方法
今天在使用rvm 1.9.3 --default设置默认的ruby的命令时出现 RVM is not a function, selecting rubies with 'rvm use ...' w ...
- 【LeetCode题解】169_求众数(Majority-Element)
目录 169_求众数(Majority-Element) 描述 解法一:暴力法 思路 Java 实现 Python 实现 复杂度分析 解法二:哈希表 思路 Java 实现 Python 实现 复杂度分 ...
- unity游戏开发之entitas框架
框架介绍 entitas是一个超快.超轻量的c# Entity-Component-System (ECS)框架,专门为Unity引擎设计.提供内部缓存和高速的组件访问,经过精心设计,可以在垃圾收集环 ...
- bootstrap、qjuery、插件 、字体网页
http://www.bootcss.com/ 前端框架bootstrap http://www.fontawesome.com.cn/faicons/ 字体图标库 https://daneden.g ...
- web前端开发教程系列-4 - 前端开发职业规划
前言 关于我:小天 1). 架构师,项目经理,产品经理 2). 中间件研发 3). VPCC 云计算基础平台管理 4). 智慧旅游 5). 智慧教育 6). 一次失败的创业体验(爱邂逅网) 一. 在开 ...
- ArchLinux - 安装指南
Step 1 将镜像写入u盘 u盘从来不是唯一的选择,但多数人可能喜欢这么做. 我是在OS X上进行操作,如果你用的是windows,也许可以使用Image Writer for Windows或者U ...