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了
  • 相关阅读:
    User-Agent大全
    Python yield 使用浅析
    解决Ubuntu终端里面显示路径名称太长
    百度搜索URL中的参数都是什么
    Fiddler 网页采集抓包利器__手机app抓包
    《samba服务配置的文本》
    《samba服务搭建》RHEL6
    《NFS文件共享服务的搭建》RHEL
    《shell脚本if..then..elif..then.if语句的总结》
    《shell条件测试语句,字符串测试apache是否开启》
  • 原文地址:https://www.cnblogs.com/sunshisonghit/p/4543293.html
Copyright © 2011-2022 走看看