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 ...
随机推荐
- [C语言]类型限定词const解析
作为C90增加的一个受限类型关键字,const赋予了它修饰的变量一个新属性——不变性,如果一个变量声明中带有关键字const,则无法通过赋值.增减运算来修改该变量的值. 一.指针与const结合 co ...
- elasticsearch分析系列
http://www.opscoder.info/category/ElasticSearch/?page=2 https://www.jianshu.com/p/0908b9ee65fc https ...
- APP消息推送机制的实现(PUSH)
出于好奇,想了解一下消息推送机制,在网上搜索到了几篇文章,感觉还不错,粘贴下来,等真正用到的时候再仔细研究 以下两篇是关于ios的 1.http://blog.csdn.net/xyxjn/artic ...
- rpm包的rpmbuild spec文件详解
http://machael.blog.51cto.com/829462/213477 上一篇日志写到,为什么要制作rpm包,以及如何使用.src.rpm文件生成rpm包.最后部分还看到.src.rp ...
- Redis--redis集群环境搭建
1.redis-cluster架构图 Redis 自3.0以后开始支持集群.从上图我们可以看出,redis集群的每个节点之间都进行相互通信,在redis集群中,不存在代理层,即没有固定的入口.redi ...
- 小白学习之Code First(五)
Fluent API:另一种配置实体类的方式,它比DataAnnorations提供了更多的配置 其中EntityTypeConfiguration这个类提供了重要的属性.方法来配置对应的实体类,可以 ...
- sgsdg
wrjow we wetwer werwer werwer werqw qweqwrq qwrqwr @ApiOperation("根据条件分页查询试卷") @ApiRespons ...
- [源码] 定义String s="abcd", 求长度
一般会答: s.length() 看源码是如何实现的: /** * Returns the length of this string. * The length is equal to the nu ...
- zoj Calculate the Function
Calculate the Function Time Limit: 2 Seconds Memory Limit: 65536 KB You are given a list of num ...
- javascript面向对象的常见写法与优缺点
我们通过表单验证的功能,来逐步演进面向对象的方式. 对于刚刚接触javascript的朋友来说,如果要写一个验证用户名,密码,邮箱的功能, 一般可能会这么写: //表单验证 var checkUs ...