• 211. Add and Search Word


    原题链接:https://leetcode.com/problems/add-and-search-word-data-structure-design/description/
    昨天在做 14. Longest Common Prefix 这道题目时,官方解答最后提及了前缀树这种数据结构,然后我就去看了下前缀树的实现的文章 https://leetcode.com/articles/implement-trie-prefix-tree/。这道题目则是前缀树相关题目之一。
    虽然我看懂了前缀树,但是并没有独立思考出这道题目,因为这道题目里面涉及到一个通配符的问题。最终看了下讨论区的答案,是使用递归解决这个问题的。哎,虽然中间我也想到了使用递归的思路,但是并没有写出实现来,究其原因大概还是因为思路不够清晰吧!下面就把这位大神的实现抄袭一遍吧:

    /**
     * Created by clearbug on 2018/3/6.
     */
    public class WordDictionary {
    
        class TrieNode {
            // R links to node children
            private TrieNode[] links;
    
            private final int R = 26;
    
            private boolean isEnd;
    
            public TrieNode() {
                links = new TrieNode[R];
            }
    
            public boolean containsKey(char ch) {
                return links[ch - 'a'] != null;
            }
    
            public TrieNode get(char ch) {
                return links[ch - 'a'];
            }
    
            public void put(char ch, TrieNode node) {
                links[ch - 'a'] = node;
            }
    
            public void setEnd() {
                isEnd = true;
            }
    
            public boolean isEnd() {
                return isEnd;
            }
    
            public TrieNode[] getLinks() {
                return links;
            }
        }
    
        private TrieNode root;
    
        /** Initialize your data structure here. */
        public WordDictionary() {
            root = new TrieNode();
        }
    
        /** Adds a word into the data structure. */
        public void addWord(String word) {
            TrieNode node = root;
            for (int i = 0; i < word.length(); i++) {
                char currentChar = word.charAt(i);
                if (!node.containsKey(currentChar)) {
                    node.put(currentChar, new TrieNode());
                }
                node = node.get(currentChar);
            }
            node.setEnd();
        }
    
        /** 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 match(word.toCharArray(), 0, root);
        }
        
        private boolean match(char[] chars, int k, TrieNode node) {
            if (k == chars.length) {
                return node.isEnd();
            }
            char currentChar = chars[k];
            if (currentChar == '.') {
                for (int j = 0; j < node.getLinks().length; j++) {
                    if (node.getLinks()[j] != null) {
                        if (match(chars, k + 1, node.getLinks()[j])) {
                            return true;
                        }
                    }
                }
            } else {
                if (node.containsKey(currentChar)) {
                    return match(chars, k + 1, node.get(currentChar));
                } else {
                    return false;
                }
            }
            return false;
        }
    
        public static void main(String[] args) {
    
            /**
             * addWord("bad")
             addWord("dad")
             addWord("mad")
             search("pad") -> false
             search("bad") -> true
             search(".ad") -> true
             search("b..") -> true
             */
    
            WordDictionary obj = new WordDictionary();
    
            obj.addWord("bad");
            obj.addWord("dad");
            obj.addWord("mad");
            System.out.println(obj.search("pad"));
            System.out.println(obj.search("bad"));
            System.out.println(obj.search(".ad"));
            System.out.println(obj.search("b.."));
            System.out.println(obj.search("abc"));
            System.out.println(obj.search("mad"));
            System.out.println(obj.search("madm"));
        }
    }
    
  • 相关阅读:
    技术博客之Saju M
    Dajax 的安装以及详细使用
    当我感觉厌倦的时候
    2014年3月22日 星期日
    windows 7远程桌面访问 ubuntu12.04
    promise的用法
    for循环中匿名同步
    开启Group Work Site功能
    Jquery根据属性模糊查询节点
    设置用户字段
  • 原文地址:https://www.cnblogs.com/optor/p/8513465.html
Copyright © 2020-2023  润新知