• Implement Trie (Prefix Tree)实现字典树


    [抄题]:

    Implement a trie with insertsearch, and startsWith methods.

    Note:
    You may assume that all inputs are consist of lowercase letters a-z.

     [暴力解法]:

    时间分析:

    空间分析:

    [思维问题]:

    [一句话思路]:

    [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

    [画图]:

    在node数组中选取一个node点来插入

    [一刷]:

    1. 搜索是在node上进行的,结果也应该保存在一个node中,用来处理返回值
    2. insert的特判是index满了,此时无法插入;不是空,空时正常插入。find的特判是满了,此时就是返回自身,不是空,因为children[pos]为空就是普通情况。
    3. 寻找的index == word.length()时,直接返回单词本身

    [二刷]:

    1. children[pos]装的就是TrieNode,没有时 需要变成一个同类型的节点,稍微理解下

    [三刷]:

    [四刷]:

    [五刷]:

      [五分钟肉眼debug的结果]:

    [总结]:

    感觉难是因为java基础不扎实,多做几次吧。

    1. insert和find都是在中间的拐点处进行的 而非从起点开始,有一般性。没见过
    2. TrieNode中对children[pos]操作,Trie中对root进行操作

    [复杂度]:Time complexity: O(n) Space complexity: O(<n)

    [英文数据结构或算法,为什么不用别的数据结构或算法]:

    1. trie的时间复杂度和hashmap一样。优点在于空间复杂度,开头相同的字符串,不必重复存。
    2. 声明成员变量、引用在方法外部,自定义的类中要有方法实例化自己 新建对象,在方法内部,后期才能用this调用。这是java的基础知识,之前没有概念。

    [关键模板化代码]:

    [其他解法]:

    [Follow Up]:

    [LC给出的题目变变变]:

    211. Add and Search Word - Data structure design 就是写类,用数据结构辅助完成

     [代码风格] :

    class TrieNode {
        //data structure
        private TrieNode[] children;
        public boolean hasWord;
        //initialization
        public TrieNode() {
            children = new TrieNode[26];
            hasWord = false;
        }
        //insert
        public void insert(String word, int index) {
            if (index == word.length()) {
                this.hasWord = true;
                return ;
            }
            int pos = word.charAt(index) - 'a';
            if (children[pos] == null) {
                children[pos] = new TrieNode();
            }
            children[pos].insert(word, index + 1);
        }
        //find
        public TrieNode find(String word, int index) {
            if (index == word.length()) {
                return this;//this
            }
            int pos = word.charAt(index) - 'a';
            if (children[pos] == null) {
                return null;
            }
            return children[pos].find(word, index + 1);//to who
        }
    }
    public class Trie {
        private TrieNode root;
        
        public Trie() {
            root = new TrieNode();
        }
    
        /*
         * @param word: a word
         * @return: nothing
         */
        public void insert(String word) {
            root.insert(word, 0);
        }
    
        /*
         * @param word: A string
         * @return: if the word is in the trie.
         */
        public boolean search(String word) {
            TrieNode node = root.find(word, 0);//to who
            return ((node != null) && (node.hasWord));
        }
    
        /*
         * @param prefix: A string
         * @return: if there is any word in the trie that starts with the given prefix.
         */
        public boolean startsWith(String prefix) {
            TrieNode node = root.find(prefix, 0);//to who
            return (node != null);
        }
    }
    View Code
  • 相关阅读:
    第 9 章
    第 8 章
    第 7 章
    第 6 章
    第 5 章
    第 4 章
    跳舞链解数独
    minic 类型声明与变量定义句型处理
    minic 动作句型处理
    minic 符号表
  • 原文地址:https://www.cnblogs.com/immiao0319/p/8471004.html
Copyright © 2020-2023  润新知