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自动机, 字符串匹配算法的更多相关文章

  1. 【学习笔记】ac自动机&fail树

    定义 解决文本串和多个模式串匹配的问题: 本质是由多个模式串形成的一个字典树,由tie的意义知道:trie上的每一个节点都是一个模式串的前缀: 在trie上加入fail边,一个节点fail边指向这个节 ...

  2. 多模字符串匹配算法之AC自动机—原理与实现

    简介: 本文是博主自身对AC自动机的原理的一些理解和看法,主要以举例的方式讲解,同时又配以相应的图片.代码实现部分也予以明确的注释,希望给大家不一样的感受.AC自动机主要用于多模式字符串的匹配,本质上 ...

  3. 【字符串算法】AC自动机

    国庆后面两天划水,甚至想接着发出咕咕咕的叫声.咳咳咳,这些都不重要!最近学习了一下AC自动机,发现其实远没有想象中的那么难. AC自动机的来历 我知道,很多人在第一次看到这个东西的时侯是非常兴奋的.( ...

  4. 字符串处理-AC自动机

    估计在OJ上刷过题的都会对AC自动机这个名词很感兴趣,同样,记得去年ACM暑期集训的时候,在最后讲到字符串部分,听说了这个算法的名字之后就对于它心向往之,AC正好是Accept的简称,字面意义上的理解 ...

  5. hdu 2296 aC自动机+dp(得到价值最大的字符串)

    Ring Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  6. Aho-Corasick 多模式匹配算法、AC自动机详解

    Aho-Corasick算法是多模式匹配中的经典算法,目前在实际应用中较多. Aho-Corasick算法对应的数据结构是Aho-Corasick自动机,简称AC自动机. 搞编程的一般都应该知道自动机 ...

  7. 【专题】字符串专题小结(AC自动机 + 后缀自动机)

    AC自动机相关: $fail$树: $fail$树上以最长$border$关系形成父子关系,我们定一个节点对应的串为根到该节点的路径. 对于任意一个非根节点$x$,定$y = fa_{x}$,那$y$ ...

  8. pku1204 Word Puzzles AC自动机 二维字符串矩阵8个方向找模式串的起点坐标以及方向 挺好的!

    /** 题目:pku1204 Word Puzzles 链接:http://poj.org/problem?id=1204 题意:给定一个L C(C <= 1000, L <= 1000) ...

  9. 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 ...

随机推荐

  1. Go 开发

    0.参数传递永远是值传递,地址也是一种值 1.go 开发环境的配置 2.import 包的几种形式: 1)_,默认导入一个包时,会将包中内容导入再执行包中的init()方法,有时并不需要某个包,只是想 ...

  2. Redis的服务命令(实现开机自启动)

    在Redis的安装目录下,有一个redis.windows-service.conf文件,即默认的配置文件, 如果需要修改端口号,或者设置密码就需要修改其中的内容: 默认端口号是6379,你可以随意修 ...

  3. 用ruby调用执行shell命令

    碰到需要调用操作系统shell命令的时候,Ruby为我们提供了六种完成任务的方法: 1.Exec方法:     Kernel#exec方法通过调用指定的命令取代当前进程:   例子:       $ ...

  4. Java I/O流-总结(InputStream,OutputStream,Reader,Writer)

    Java流总结 一. 流的分类 • 按数据流动方向 – 输入流:只能从中读取字节数据,而不能向其写出数据 – 输出流:只能向其写入字节数据,而不能从中读取数据 • 按照流所处理的数据类型 – 字节流: ...

  5. 使用Mac命令别名,提升工作效率

    为系统添加命令别名可以提高我们的工作效率,告别命令繁琐,庸长的的烦恼. Mac的~/.bash_profile文件提供了为系统添加命令别名的地方.所以我们要操作的也是这个文件. 下面是修改~/.bas ...

  6. Mybatis中同时使用shardbatis和pagehelper插件冲突问题

    在一次使用mybatis的插件,分表shardbatis+分页pagehelper共同使用的时候,会抛出以下异常: java.lang.NoSuchMethodError: net.sf.jsqlpa ...

  7. handlebars——另外一个模板引擎

    什么是handlebars? handlebars库是另外一个模板引擎,他继承mustache(胡子),感觉没有jade(珠宝)好听,他不允许在模板中写很多JavaScript的逻辑.这有助于保持模板 ...

  8. Winfrom 基于TCP的Socket服务端 多线程(进阶版)

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  9. C# 学习笔记(二) 时间格式化字符串

    1. 以下4种时间格式化符号输出的固定时间格式在各个区域设置中都应是相同的: 标准格式字符串 由 DateTimeFormatInfo.InvariantInfo 属性定义 自定义格式字符串 “O”或 ...

  10. [日常] Go语言圣经-命令行参数

    1.编译 go build hello.go 2.go get gopl.io/ch1/helloworld 命令,就会从网上获取代码,并放到对应目录中 下载的代码会放在$GOPATH/src/gop ...