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了
  • 相关阅读:
    倒序数组的算法
    SQL 日期操作函数
    sp_executesql 练习
    c#编译器对byte类型的一些规则
    角度在excel中如何输入并使其能计算
    5天学会fx5800计算器测量编程(二) fx5800函数学习
    5天学会fx5800计算器测量编程(二) fx5800语法学习
    如何快速的将大地坐标系导入进施工结构的cad平面图纸中
    CAD中批量导入坐标和点号的方法命令
    5天学会fx5800计算器测量编程(一)
  • 原文地址:https://www.cnblogs.com/sunshisonghit/p/4543293.html
Copyright © 2011-2022 走看看