Trie树的python实现(leetcode 208)

 #!/usr/bin/env python
#-*- coding: utf-8 -*-
import sys
import pdb reload(sys)
sys.setdefaultencoding('utf-8') class TrieNode(object):
"""Trie节点 Attributes:
_val: 本节点的值(非None即作为结束判断条件)
_next: 后继节点
"""
def __init__(self, value=None):
self._val = value
self._next = {} def set_value(self, value=None):
"""为当前节点设置值
"""
self._val = value def get_value(self):
"""获取当前节点的值
"""
return self._val def set_next(self, key, value=None):
"""为当前节点添加一个后继节点
"""
if key not in self._next:
self._next[key] = TrieNode(value)
return self._next[key] def get_next(self, key):
"""从当前节点获取指定的后继节点
"""
if key not in self._next:
return None
return self._next[key] class Trie(object):
"""Trie树
Attribures:
_root: 根节点
"""
def __init__(self):
# 生成root节点
self._root = TrieNode() def insert(self, word):
"""将一个单词插入trie树
"""
curr = self._root for char in word:
curr = curr.set_next(char)
curr.set_value(True) def search(self, word):
"""检索一个单词是否trie树中存在
"""
curr = self._root
ret = False for i, c in enumerate(word):
curr = curr.get_next(c)
if curr is None:
break
if i + 1 == len(word) and curr.get_value() is True:
ret = True
break
return ret def startsWith(self, prefix):
"""检索trie树中是否有prefix开头的单词
"""
curr = self._root
ret = True for c in prefix:
curr = curr.get_next(c)
if curr is None:
ret = False
break
return ret def main():
trie = Trie()
trie.insert("app")
trie.insert("apple")
print trie.search("app") if __name__ == '__main__':
main()

AC改进算法python实现

 #!/usr/bin/env python
#-*- coding: utf-8 -*-
import sys
import pdb reload(sys)
sys.setdefaultencoding('utf-8') class ACTrieNode(object):
"""ACTrie节点 Attributes:
val: 本节点的值(非None即作为结束判断条件)
children: 孩子节点
fail: 失配跳转指针
"""
def __init__(self, value=None):
self.val = value
self.children = {}
self.fail = None def get_next(self, key):
"""从本节点开始,找到children中包含key的节点,如果找不到就返回根节点
"""
if key in self.children.keys():
return self.children[key]
if self.fail is None:
# fail为None就是根节点
return self
return self.fail.get_next(key) class ACTrie(object):
"""ACTrie树 Attribures:
_root: 根节点
"""
def __init__(self):
self._root = ACTrieNode() # 生成root节点 def insert(self, word):
"""将一个单词插入trie树
"""
curr = self._root
for char in word:
if char not in curr.children:
curr.children[char] = ACTrieNode()
curr = curr.children[char]
curr.val = word def update_failure(self):
"""更新failure跳转
"""
bfs_queue = [self._root] # 利用list作为bfs缓存队列 while len(bfs_queue) > 0:
father = bfs_queue.pop(0) # 取出队列头部元素 # BFS遍历父节点的所有子节点,为他们设置failure
for key, child in father.children.items():
bfs_queue.append(child) # 将当前元素放入队列尾部 if father == self._root:
# 当前父节点是root时,其子节点的failure也指向root
child.fail = self._root
else:
# 当前父节点不是root时,其子节点的failure尝试指向"(迭代)父节点的failure的同名子节点"
child.fail = father.fail.get_next(key) def search(self, text):
"""从源字符串中寻找目标字符串
"""
match_set = set()
curr = self._root for char in text:
curr = curr.get_next(char)
# 搜集匹配上的单词
tmp_node = curr
while tmp_node:
if tmp_node.val:
match_set.add(tmp_node.val)
tmp_node = tmp_node.fail
return match_set def main():
trie = ACTrie()
trie.insert("abcd")
trie.insert("ab")
trie.insert("bc")
trie.insert("cf")
trie.insert("cde") trie.update_failure() text = 'abcdefg'
ret = trie.search(text)
print ret if __name__ == '__main__':
main()

字符串模式匹配算法系列(三):Trie树及AC改进算法的更多相关文章

  1. 字符串模式匹配算法系列(二):KMP算法

    算法背景: KMP算法是由Donald Knuth和Vaughan Pratt于1970年共同提出的,而James H.Morris也几乎同时间独立提出了这个算法.因此人们将其称作“克努特-莫里斯-普 ...

  2. 字符串模式匹配算法系列(一):BF算法

    算法背景: BF(Brute Force)算法,是一种在字符串匹配的算法中,比较符合人类自然思维方式的方法,即对源字符串和目标字符串逐个字符地进行比较,直到在源字符串中找到完全与目标字符串匹配的子字符 ...

  3. [转] 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽

    字符串模式匹配算法——BM.Horspool.Sunday.KMP.KR.AC算法一网打尽 转载自:http://dsqiu.iteye.com/blog/1700312 本文内容框架: §1 Boy ...

  4. 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法一网打尽

    字符串模式匹配算法——BM.Horspool.Sunday.KMP.KR.AC算法一网打尽 本文内容框架: §1 Boyer-Moore算法 §2 Horspool算法 §3 Sunday算法 §4 ...

  5. 字符串模式匹配算法——BM、Horspool、Sunday、KMP、KR、AC算法

    ref : https://dsqiu.iteye.com/blog/1700312 本文内容框架: §1 Boyer-Moore算法 §2 Horspool算法 §3 Sunday算法 §4 KMP ...

  6. 字符串模式匹配算法--BF和KMP详解

    1,问题描述 字符串模式匹配:串的模式匹配 ,是求第一个字符串(模式串:str2)在第二个字符串(主串:str1)中的起始位置. 注意区分: 子串:要求连续   (如:abc 是abcdef的子串) ...

  7. Java数据结构之字符串模式匹配算法---Brute-Force算法

    模式匹配 在字符串匹配问题中,我们期待察看源串 " S串 " 中是否含有目标串 " 串T " (也叫模式串).其中 串S被称为主串,串T被称为子串. 1.如果在 ...

  8. [知识点]Trie树和AC自动机

    // 此博文为迁移而来,写于2015年5月27日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w1s8.html 1.前 ...

  9. 字符串模式匹配算法1 - BF和KMP算法

    在字符串S中定位/查找某个子字符串P的操作,通常称为字符串的模式匹配,其中P称为模式串.模式匹配有多种算法,这里先总结一下BF算法和KMP算法. 注意:本文在讨论字符位置/指针/下标时,全部使用C语法 ...

随机推荐

  1. xshell的安装及连接linux的使用方法

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/lx_Frolf/article/deta ...

  2. Selenium:多表单(frame/iframe)切换(Switch模块)

    frame标签有frameset.frame.iframe三种,frameset跟其他普通标签没有区别,不会影响到正常的定位,而frame与iframe需要切换进去才能定位到其中的元素 比如下面这个网 ...

  3. ss证书问题

    #SSL--校验网站证书 #一.什么是SSL证书 from urllib import request #ssl免验证 import ssl ssl._create_default_https_con ...

  4. MVC的布局页,视图布局页和分布页的使用

    一,结构如下图 二,布局页和视图布局页 1>使用方法一 _ViewStart.cshtml @{ Layout = "~/Views/Shared/_Layout.cshtml&quo ...

  5. linux mysql数据库安装

    1.创建mysql用户账号:groupadd mysqluseradd -d /sbin/nolog -g mysql -M mysql-s /sbin/nologin 表示禁止该用户登录,只需要角色 ...

  6. React-Native初识-安卓篇(一)

    前言:React-Native简称RN,可以用来构建Android和IOS的应用程序,在接下来的两个半月里,我会记录下本人在学习RN开发项目中的点滴. 本篇目录: 1.React-Native初识 2 ...

  7. 【转】优秀的Vue UI组件库

    原文来源:https://www.leixuesong.com/3342 Vue 是一个轻巧.高性能.可组件化的MVVM库,API简洁明了,上手快.从Vue推出以来,得到众多Web开发者的认可.在公司 ...

  8. Sql 将A表数据插入到B表

    A表和B表字段不同 --insert into B(Name,PersonalId,Education,IsDel) select Name, PersonId as PersonalId, ( ca ...

  9. linux100day(day7)--用户管理和权限管理简单介绍

    系统基础 计算机的三大部件 CPU 内存 IO 总线 一般使用system call和api来调用硬件 一些基础命令, pwd 查看当前路径 cal 计算器 clock 时钟 hwclock 显示与设 ...

  10. 三、bootstrap-treeview

    一.bootstrap-treeview 修饰标签为徽章 参考 https://www.cnblogs.com/bin521/p/8403588.html