1.. Trie通常被称为"字典树"或"前缀树"
  • Trie的形象化描述如下图:
  • Trie的优势和适用场景
2.. 实现Trie
  • 实现Trie的业务无逻辑如下:
  • import java.util.TreeMap;
    
    public class Trie {
    
        private class Node {
    
            public boolean isWord;
    public TreeMap<Character, Node> next; // 构造函数
    public Node(boolean isWord) {
    this.isWord = isWord;
    next = new TreeMap<>();
    } // 无参数构造函数
    public Node() {
    this(false);
    }
    } private Node root;
    private int size; // 构造函数
    public Trie() {
    root = new Node();
    size = 0;
    } // 实现getSize方法,获得Trie中存储的单词数量
    public int getSize() {
    return size;
    } // 实现add方法,向Trie中添加新的单词word
    public void add(String word) { Node cur = root;
    for (int i = 0; i < word.length(); i++) {
    char c = word.charAt(i);
    if (cur.next.get(c) == null) {
    cur.next.put(c, new Node());
    }
    cur = cur.next.get(c);
    }
    if (!cur.isWord) {
    cur.isWord = true;
    size++;
    }
    } // 实现contains方法,查询Trie中是否包含单词word
    public boolean contains(String word) { Node cur = root;
    for (int i = 0; i < word.length(); i++) {
    char c = word.charAt(i);
    if (cur.next.get(c) == null) {
    return false;
    }
    cur = cur.next.get(c);
    }
    return cur.isWord; // 好聪明
    } // 实现isPrefix方法,查询Trie中时候保存了以prefix为前缀的单词
    public boolean isPrefix(String prefix) { Node cur = root;
    for (int i = 0; i < prefix.length(); i++) {
    char c = prefix.charAt(i);
    if (cur.next.get(c) == null) {
    return false;
    }
    cur = cur.next.get(c);
    }
    return true;
    }
    }

3.. Trie和简单的模式匹配

  • 实现的业务逻辑如下:
  • import java.util.TreeMap;
    
    class WordDictionary {
    
        private class Node {
    
            public boolean isWord;
    public TreeMap<Character, Node> next; public Node(boolean isWord) {
    this.isWord = isWord;
    next = new TreeMap<>();
    } public Node() {
    this(false);
    } } /**
    * Initialize your data structure here.
    */
    private Node root; public WordDictionary() {
    root = new Node();
    } /**
    * Adds a word into the data structure.
    */
    public void addWord(String word) {
    Node cur = root;
    for (int i = 0; i < word.length(); i++) {
    char c = word.charAt(i);
    if (cur.next.get(c) == null) {
    cur.next.put(c, new Node());
    }
    cur = cur.next.get(c);
    }
    cur.isWord = true;
    } /**
    * Returns if the word is in the data structure. A word could contain the dot character '.' to represent any one letter.
    */
    public boolean search(String word) {
    return match(root, word, 0);
    } private boolean match(Node node, String word, int index) {
    if (index == word.length()) {
    return node.isWord;
    } char c = word.charAt(index);
    if (c != '.') {
    if (node.next.get(c) == null) {
    return false;
    }
    return match(node.next.get(c), word, index + 1);
    } else {
    for (char nextChar : node.next.keySet()) {
    if (match(node.next.get(nextChar), word, index + 1)) {
    return true;
    }
    }
    return false;
    }
    }
    }

第三十篇 玩转数据结构——字典树(Trie)的更多相关文章

  1. 第三十二篇 玩转数据结构——AVL树(AVL Tree)

          1.. 平衡二叉树 平衡二叉树要求,对于任意一个节点,左子树和右子树的高度差不能超过1. 平衡二叉树的高度和节点数量之间的关系也是O(logn) 为二叉树标注节点高度并计算平衡因子 AVL ...

  2. 第三十三篇 玩转数据结构——红黑树(Read Black Tree)

    1.. 图解2-3树维持绝对平衡的原理: 2.. 红黑树与2-3树是等价的 3.. 红黑树的特点 简要概括如下: 所有节点非黑即红:根节点为黑:NULL节点为黑:红节点孩子为黑:黑平衡 4.. 实现红 ...

  3. 第三十一篇 玩转数据结构——并查集(Union Find)

    1.. 并查集的应用场景 查看"网络"中节点的连接状态,这里的网络是广义上的网络 数学中的集合类的实现   2.. 并查集所支持的操作 对于一组数据,并查集主要支持两种操作:合并两 ...

  4. 第二十九篇 玩转数据结构——线段树(Segment Tree)

          1.. 线段树引入 线段树也称为区间树 为什么要使用线段树:对于某些问题,我们只关心区间(线段) 经典的线段树问题:区间染色,有一面长度为n的墙,每次选择一段墙进行染色(染色允许覆盖),问 ...

  5. Java数据结构——字典树TRIE

    又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种. 典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计. 它的优点是:利用字符串的公共 ...

  6. 模板 - 字符串/数据结构 - 字典树/Trie

    使用静态数组的nxt指针的设计,大概比使用map作为nxt指针的设计要快1倍,但空间花费大概也大1倍.在数据量小的情况下,时间和空间效率都不及map<vector,int>.map< ...

  7. [POJ] #1002# 487-3279 : 桶排序/字典树(Trie树)/快速排序

    一. 题目 487-3279 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 274040   Accepted: 48891 ...

  8. Delphi 泛型(三十篇)

    Delphi 泛型(三十篇)http://www.cnblogs.com/jxgxy/category/216671.html

  9. 字典树(Trie)详解

    详解字典树(Trie) 本篇随笔简单讲解一下信息学奥林匹克竞赛中的较为常用的数据结构--字典树.字典树也叫Trie树.前缀树.顾名思义,它是一种针对字符串进行维护的数据结构.并且,它的用途超级广泛.建 ...

随机推荐

  1. scrapy(一)--Pycharm创建scrapy项目

    1.环境 操作系统:windows10. python版本:python3.6,Anaconda(将Anaconda3\Scripts;路径添加到环境变量Path中) pycharm:pycharm2 ...

  2. Xamarin.Forms登录对话框及表单验证

    微信公众号:Dotnet9,网站:Dotnet9,问题或建议,请网站留言: 如果您觉得Dotnet9对您有帮助,欢迎赞赏. Xamarin.Forms登录系统 内容目录 实现效果 业务场景 编码实现 ...

  3. WPF DataGrid标题Header Binding失效

    前言:因业务需要对WPF中的DataGrid控件中的行数进行统计,同时把统计的行数显示在列标题上. 如果我们用常规的Binding手段更新DataGridTextColunm的Header的话是不会生 ...

  4. JS实现简易计算器的7种方法

    先放图(好吧比较挫) 方法一:最容易版 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta ...

  5. node-express处理表单的接口

    写一个小接口,用postman测试接口是否可行

  6. Java设计模式(二)设计模式原则

    学习Java设计模式之前,有必要先了解设计模式原则. 开闭原则 定义 一个软件实体如类.模块和函数应该对扩展开放,对修改关闭 用抽象构建框架,用实现扩展细节 优点:提高软件系统的可复用性及可维护性 C ...

  7. ACM-ICPC 2018 焦作赛区网络预赛 Give Candies 题解

    ACM-ICPC 2018 焦作赛区网络预赛 Give Candies n个糖果分给n个小朋友 从1到n个小朋友依次给,每次随机给个数,至少一个,知道没有糖果为止. 问糖果的分布情况方案数. 输出方案 ...

  8. [转]TCP/IP 协议基础(一)

    参考书籍为<图解tcp/ip>-第五版.这篇随笔,主要内容还是TCP/IP所必备的基础知识,包括计算机与网络发展的历史及标准化过程(简述).OSI参考模型.网络概念的本质.网络构建的设备等 ...

  9. 【vue 权威指南】 学习笔记 二

    1.指令 1.1内部指令 基础指令:v-show , v-else , v-model , v-repeat , v-for , v-text , v-el , v-html , v-on , v-b ...

  10. CTF入门 |“男神”背后的隐写术

    刚刚开始学CTF,记录一下做的第一道隐写题 ~ 附件下载 题目背景(我自己瞎编的): Luyu是CPPU的校草,一直以来他的写真照被各届校友广泛流传,最近江湖上流传着拿到这些照片就能知道Luyu的QQ ...