后缀树 - 多模式匹配
来源:互联网 发布:法语考研方向知乎 编辑:程序博客网 时间:2024/06/11 19:32
学习了 cracking code interview 18.8 之后的整理。
用后缀树(Suffix Trie)寻找长字符串S中所有出现的子串T
原理: 如果T为S的子串, 那么T一定是S某个后缀的前缀(或本身); 后缀树的root必须为空
时间复杂度:构造树 O(ns^2)
查找 O(nt)
1. 后缀树类, 后缀树存了字符串S所有的后缀
public class SuffixTreeNode {// 当前root的孩子们// 若为英语小写字母,则最多有26个孩子HashMap<Character, SuffixTreeNode> children = new HashMap<Character, SuffixTreeNode>();char value; // 当前节点的值// 存该后缀出现的起始位置,即多模式查找的结果// exp: S = bibs, T = b, 则 节点b的 indexes = [0,3]ArrayList<Integer> indexes = new ArrayList<Integer>();public SuffixTreeNode(){}public void insertString(String s, int index){indexes.add(index); // 添加当前indexif(s != null && s.length() > 0){value = s.charAt(0);SuffixTreeNode child = null;// 若root已经有这个value的孩子了,则将后缀附加到这个子节点树上if(children.containsKey(value)){child = children.get(value);}else{child = new SuffixTreeNode();children.put(value, child);}String remainder = s.substring(1);// 递归添加后缀child.insertString(remainder, index);}}public ArrayList<Integer> search(String s){if(s == null || s.length() == 0)return indexes;else{char first = s.charAt(0);if(children.containsKey(first)){String remainder = s.substring(1);return children.get(first).search(remainder);}}return null;}}
2. 构造S的后缀树 - O(ns^2)
public class SuffixTrie {// 后缀树的根节点必须为空SuffixTreeNode root = new SuffixTreeNode();// 构造S的后缀树public SuffixTrie(String s){for(int i = 0; i < s.length(); i++){String suffix = s.substring(i);root.insertString(suffix, i);}}public ArrayList<Character> search(String t){return root.search(t);}}
3. 使用后缀树查找
public ArrayList<Integer> findSubStr(String s, String t){SuffixTrie trie = new SuffixTrie(s);return trie.search(t);}
0 0
- 后缀树 - 多模式匹配
- 精确多模式匹配问题-关键词树、后缀树
- 字符串匹配之后缀树
- 使用后缀树快速处理字符串匹配
- 【后缀树】子串匹配结构
- 【后缀树】子串匹配结构
- 基于后缀树的字符串匹配算法
- 单模式匹配 多模式匹配
- 多模式匹配算法
- 多模式匹配ACBM
- 多模式字符串匹配
- 多模式匹配
- 多模式匹配算法
- 多模式匹配算法
- 后缀树(Suffix Tree)的文本匹配算法
- 后缀树(Suffix Tree)的文本匹配算法
- 字符串匹配:后缀树组模板(关键点理解)
- 字符串匹配(后缀数组)
- Rome to Intger
- 在这信息发达的今天做什么站好呢
- 解决Eclipse/MyEclipse中js中文乱码
- RH436之存储管理
- 塔防游戏
- 后缀树 - 多模式匹配
- smallbin double linked list corrupted
- !!!Chapter 3 The Data Link Layer
- KMP 单模式匹配, 实现 strStr()
- hee
- How to solve "\Java\jdk1.7.0_45' was unexpected at this time." while starting jboss-eap-6.2
- Android开发学习笔记:数据存取之SQLite浅析
- SQLite 管理工具 SQLiteDeveloper 及破解
- 搭建SSh框架,我们应该遵循的步骤