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了
  • 相关阅读:
    StatusStrip控件的使用(转:http://blog.sina.com.cn/s/blog_4f18c3ec0100fguf.html)
    linux根文件系统
    git使用技巧
    修改git用户名
    luci中添加application
    openwrt安装依赖库
    STM32(二十九)定时器介绍
    openwrt部分文件解析
    uci.js文件解析
    矿机算力
  • 原文地址:https://www.cnblogs.com/sunshisonghit/p/4543293.html
Copyright © 2011-2022 走看看