zoukankan      html  css  js  c++  java
  • 单词的添加与查找 · 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
  • 相关阅读:
    [OpenJudge] 反正切函数的应用 (枚举)(数学)
    [OpenJudge] 摘花生 (模拟)
    [OpenJudge] 宇航员(模拟)
    [OpenJudge] 显示器(模拟)
    背包问题
    BFS_最短路径
    链表
    网站
    网站
    洛谷_递归整理
  • 原文地址:https://www.cnblogs.com/immiao0319/p/8481130.html
Copyright © 2011-2022 走看看