单词的添加与查找 · Add and Search Word

[抄题]:

设计一个包含下面两个操作的数据结构: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循环

[一句话思路]:

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

[画图]:

[一刷]:

  1. now.children[c - 'a'] = new TrieNode(); 表示26叉树中建立了新字母。now = now.children[c - 'a'];表示赋值给当前节点。
  2. 所有函数中都是对指针now操作,都要返回节点.hasWord。新类中的每个变量都要处理,以前不知道。
  3. 如果now.children[c - 'a']已经初始化出节点,就持续find(word, index + 1, now.chidren[c - 'a']);直到退出。类似dfs, 没理解
  4. 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
         }
自定义find函数再调用

[其他解法]:

[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);
    }
}
View Code
原文地址:https://www.cnblogs.com/immiao0319/p/8481130.html