[抄题]:
设计一个包含下面两个操作的数据结构:addWord(word)
, search(word)
addWord(word)
会在数据结构中添加一个单词。而search(word)
则支持普通的单词查询或是只包含.
和a-z
的简易正则表达式的查询。
一个 .
可以代表一个任何的字母。
addWord("bad")
addWord("dad")
addWord("mad")
search("pad") // return false
search("bad") // return true
search(".ad") // return true
search("b..") // return true
[暴力解法]:
时间分析:
空间分析:
[思维问题]:
api的题要写自定义函数,比较有灵活性。忘了
不知道正则表达式怎么用:for循环
[一句话思路]:
[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):
[画图]:
[一刷]:
- now.children[c - 'a'] = new TrieNode(); 表示26叉树中建立了新字母。now = now.children[c - 'a'];表示赋值给当前节点。
- 所有函数中都是对指针now操作,都要返回节点.hasWord。新类中的每个变量都要处理,以前不知道。
- 如果now.children[c - 'a']已经初始化出节点,就持续find(word, index + 1, now.chidren[c - 'a']);直到退出。类似dfs, 没理解
- find的查找具有一般性,所以从now开始找,search调用时起点为0即可。自定义的函数一般都具有一般性。
[二刷]:
[三刷]:
[四刷]:
[五刷]:
[五分钟肉眼debug的结果]:
[总结]:
正则表达式就是用for循环,先不要加括号。括号中有一个成立就是true, 括号外全都不成立才为false.
[复杂度]:Time complexity: O(n) Space complexity: O(<n)
[英文数据结构或算法,为什么不用别的数据结构或算法]:
trie字典树,正则表达式0-26有一个就行 写起来简单,hash写起来麻烦
[关键模板化代码]:
api题:

find(String word, int index, TrieNode now) { if (index == word.length()) { return now.hasWord;//buyiding zhaodao }
[其他解法]:
[Follow Up]:
[LC给出的题目变变变]:
745. Prefix and Suffix Search 前缀 用sum
[代码风格] :

//class TrieNode class TrieNode { TrieNode[] children = new TrieNode[26]; boolean hasWord; TrieNode () { for (int i = 0; i < 26; i++) { children[i] = null; } hasWord = false; } } public class WordDictionary { /* * @param word: Adds a word into the data structure. * @return: nothing */ TrieNode root; WordDictionary () { root = new TrieNode(); } public void addWord(String word) { TrieNode now = root; for (int i = 0; i < word.length(); i++) { char c = word.charAt(i); //no TrieNode if (now.children[c - 'a'] == null) { now.children[c - 'a'] = new TrieNode(); } now = now.children[c - 'a']; } now.hasWord = true; } //find(word, index, i) private boolean find(String word, int index, TrieNode now) { if (index == word.length()) { return now.hasWord;//buyiding zhaodao } char c = word.charAt(index); if (c == '.') { for (int i = 0; i < 26; i++) if (now.children[i] != null) { if (find(word, index + 1, now.children[i])) { return true; } } return false; }else if (now.children[c - 'a'] != null) { return find(word, index + 1, now.children[c - 'a']); }else { return false; } } public boolean search(String word) { return find(word, 0, root); } }