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

    Add and Search Word - Data structure design

    问题:

    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.

    思路:

      前缀树+回溯

    我的代码:

    public class WordDictionary {
    
        private TrieNode root;
    
        public WordDictionary() {
            root = new TrieNode();
        }
        public void addWord(String word) {
            HashMap<Character, TrieNode> children = root.children;
            for(int i=0; i<word.length(); i++)
            {
                TrieNode node;
                char c = word.charAt(i);
                if(children.containsKey(c)) node = children.get(c);
                else
                {
                    node = new TrieNode(c);
                    children.put(c,node);
                }
                children = node.children;
                if(i == word.length()-1)
                {
                    node.isWord = true;
                }
            }
        }
        public boolean search(String word) {
            if(word==null || word.length()==0)    return true;
            HashMap<Character, TrieNode> children = root.children;
            return helperSearch(word, children);
            
        }
        public boolean helperSearch(String word, HashMap<Character, TrieNode> hash)
        {
            if(word.length() == 1)
            {
                char c = word.charAt(0);
                if(c == '.')
                {
                    for(char key : hash.keySet())
                    {
                        if(hash.get(key).isWord) return true;
                    }
                    return false;
                }
                else
                {
                    if(hash.containsKey(c))        return hash.get(c).isWord;
                    else return false;
                }
            }
            if(word.charAt(0) == '.')
            {
                for(char c: hash.keySet())
                {
                    if(helperSearch(word.substring(1), hash.get(c).children))   return true;   
                }
                return false;
            }
            else
            {
                char c = word.charAt(0);
                if(hash.containsKey(c))
                {
                    return helperSearch(word.substring(1), hash.get(c).children);
                }
                else return false;
            }
        }
        class TrieNode {
            public TrieNode() {
            }
            public TrieNode(char c) {
                this.c = c;
            }
            char c;
            HashMap<Character, TrieNode> children = new HashMap<Character, TrieNode>();  
            boolean isWord;
        }
    }
    View Code

    学习之处:

    • 之前做了前缀树的解法,很自然的考虑到了回溯的解法,一遍AC了
  • 相关阅读:
    WeX5那些坑
    项目总结-微信公众平台Html5
    项目总结-APP中的HTML5
    夜幕团队成员的工资究竟几 K ?
    Docker竟然还能这么玩?商业级4G代理搭建实战!
    今天,大佬云集的夜幕团队正式成立了!
    InnoDB物理行中null值的存储的推断与验证
    探究InnoDB数据页内部行的存储方式
    DAO模式
    JDBC
  • 原文地址:https://www.cnblogs.com/sunshisonghit/p/4543293.html
Copyright © 2011-2022 走看看