zoukankan      html  css  js  c++  java
  • 211. Add and Search Word

    题目:

    Design a data structure that supports the following two operations:

    void addWord(word)
    bool search(word)
    

    search(word) can search a literal word or a regular expression string containing only letters a-z or .. A . means it can represent any one letter.

    For example:

    addWord("bad")
    addWord("dad")
    addWord("mad")
    search("pad") -> false
    search("bad") -> true
    search(".ad") -> true
    search("b..") -> true
    

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

    click to show hint.

    You should be familiar with how a Trie works. If not, please work on this problem: Implement Trie (Prefix Tree) first.

    链接: http://leetcode.com/problems/add-and-search-word-data-structure-design/

    题解:

    设计一个Data Structure来search和add单词。这道题我们又可以用一个R-Way Trie来完成。 像JQuery里面的Auto-complete功能其实就可以用R-Way Trie based method来设计和编程。注意当字符为"."的时候我们要loop当前节点的全部26个子节点,这里要用一个DFS。

    Time Complexity - O(n),  Space Complextiy - O(26n)。

    public class WordDictionary {
        private TrieNode root = new TrieNode();
        
        private class TrieNode {
            private final int R = 26;           // radix = 26
            public TrieNode[] next;
            public boolean isWord;
            
            public TrieNode() {
                next = new TrieNode[R];
            }
        }
    
        // Adds a word into the data structure.
        public void addWord(String word) {
            if(word == null || word.length() == 0)
                return;
            TrieNode node = root;
            int d = 0;
            
            while(d < word.length()) {
                char c = word.charAt(d);
                if(node.next[c - 'a'] == null)
                    node.next[c - 'a'] = new TrieNode();
                node = node.next[c - 'a'];
                d++;
            }
            
            node.isWord = true;
        }
    
        // Returns if the word is in the data structure. A word could
        // contain the dot character '.' to represent any one letter.
        public boolean search(String word) {
            if(word == null || word.length() == 0)
                return false;
            TrieNode node = root;
            int d = 0;
            
            return search(node, word, 0);
        }
        
        private boolean search(TrieNode node, String word, int d) {
            if(node == null)
                return false;
            if(d == word.length())
                return node.isWord;
            char c = word.charAt(d);
            if(c == '.') {
                for(TrieNode child : node.next) {
                    if(child != null && search(child, word, d + 1))
                        return true;
                }
                return false;
            } else {
                return search(node.next[c - 'a'], word, d + 1);
            }
        }
    }
    
    // Your WordDictionary object will be instantiated and called as such:
    // WordDictionary wordDictionary = new WordDictionary();
    // wordDictionary.addWord("word");
    // wordDictionary.search("pattern");

    二刷:

    方法和一刷一样,主要使用Trie。addWord的时候还是使用和Trie的insert一样的的代码。 Search的时候因为有一个通配符'.',所以我们要用dfs搜索节点的26个子节点。

    假如使用Python的话可以不用Trie,直接用dict来做。

    Java:

    Time Complexity:  addWord - O(L) ,   search - O(26L),  Space Complexity - O(26L)   这里 L是单词的平均长度。

    public class WordDictionary {
        TrieNode root = new TrieNode();
        // Adds a word into the data structure.
        public void addWord(String word) {
            if (word == null) return;
            TrieNode node = this.root;
            int d = 0;
            while (d < word.length()) {
                int index = word.charAt(d) - 'a';
                if (node.next[index] == null) node.next[index] = new TrieNode();
                node = node.next[index];
                d++;
            }
            node.isWord = true;
        }
    
        // Returns if the word is in the data structure. A word could
        // contain the dot character '.' to represent any one letter.
        public boolean search(String word) {
    return search(word, root, 0);
        }
        
        private boolean search(String word, TrieNode node, int depth) {
            if (node == null) return false;
            if (depth == word.length()) return node.isWord;
            char c = word.charAt(depth);
            if (c != '.') {
                return search(word, node.next[c - 'a'], depth + 1);
            } else {
                for (TrieNode nextNode : node.next) {
                    if (search(word, nextNode, depth + 1)) return true;
                }
                return false;
            }
        }
        
        private class TrieNode {
            TrieNode[] next;
            int R = 26;
            boolean isWord;
            
            public TrieNode() {
                this.next = new TrieNode[R];
            }
        }
    }
    
    // Your WordDictionary object will be instantiated and called as such:
    // WordDictionary wordDictionary = new WordDictionary();
    // wordDictionary.addWord("word");
    // wordDictionary.search("pattern");

    Reference:

    https://leetcode.com/discuss/35878/java-hashmap-backed-trie

    https://leetcode.com/discuss/35928/my-simple-and-clean-java-code

    https://leetcode.com/problems/implement-trie-prefix-tree/

    https://leetcode.com/discuss/69963/python-168ms-beat-100%25-solution

  • 相关阅读:
    JQuery判断CheckBox是否选中
    Ghost下的gho镜像分区工具
    JQuery提示$(...).on is not a function解决方法
    Jetty错误: badMessage: java.lang.IllegalStateException: too much data after closed for HttpChannelOverHttp@472adad9{r=2,c=false,a=IDLE,uri=}
    Linux下使用Shell过滤重复文本(转)
    JQuery给动态HTML绑定事件
    Chrome插件在页面上直接绑定JavaScript事件提示Refused to execute inline event handler because it violates the following Co
    解决——》java.lang.IllegalArgumentException: Body parameter 0 was null
    qhclass
    java类uuid源码分析
  • 原文地址:https://www.cnblogs.com/yrbbest/p/4979621.html
Copyright © 2011-2022 走看看