[抄题]:
Implement a trie with insert
, search
, and startsWith
methods.
Note:
You may assume that all inputs are consist of lowercase letters a-z
.
[暴力解法]:
时间分析:
空间分析:
[思维问题]:
[一句话思路]:
[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):
[画图]:
在node数组中选取一个node点来插入
[一刷]:
- 搜索是在node上进行的,结果也应该保存在一个node中,用来处理返回值
- insert的特判是index满了,此时无法插入;不是空,空时正常插入。find的特判是满了,此时就是返回自身,不是空,因为children[pos]为空就是普通情况。
- 寻找的index == word.length()时,直接返回单词本身。
[二刷]:
- children[pos]装的就是TrieNode,没有时 需要变成一个同类型的节点,稍微理解下
[三刷]:
[四刷]:
[五刷]:
[五分钟肉眼debug的结果]:
[总结]:
感觉难是因为java基础不扎实,多做几次吧。
- insert和find都是在中间的拐点处进行的 而非从起点开始,有一般性。没见过
- TrieNode中对children[pos]操作,Trie中对root进行操作
[复杂度]:Time complexity: O(n) Space complexity: O(<n)
[英文数据结构或算法,为什么不用别的数据结构或算法]:
- trie的时间复杂度和hashmap一样。优点在于空间复杂度,开头相同的字符串,不必重复存。
- 声明成员变量、引用在方法外部,自定义的类中要有方法实例化自己 新建对象,在方法内部,后期才能用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); } }