zoukankan      html  css  js  c++  java
  • [leedcode 211] Add and Search Word

    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.

    For example:

    addWord("bad")
    addWord("dad")
    addWord("mad")
    search("pad") -> false
    search("bad") -> true
    search(".ad") -> true
    search("b..") -> true
    public class WordDictionary {
        //字典树的变形,每个节点保存一个字符,以及子节点集合:list,和标记是否是尾节点的isEnd布尔值
        //add和search方法都利用递归进行实现
        private Node root;
        static class Node{
            public Character val;
            public List<Node> children;
            public boolean isEnd;
            public Node(Character val){
                this.val=val;
                children=new ArrayList<Node>();
                isEnd=false;
                
            }
        }
        public WordDictionary(){
            root=new Node('/');
        }
    
        // Adds a word into the data structure.
        public void addWord(String word) {
            addword(word,root);
        }
        public void addword(String word,Node root){
            if(word.length()==0){
                root.isEnd=true;
                return ;
            }
            Node cur=null;//代表匹配的新节点
            if(root.children.size()>0){
                for(Node node:root.children){
                    if(node.val==word.charAt(0)){
                        cur=node;
                        break;
                        
                    }
                }
                
            }
            if(cur!=null) addword(word.substring(1),cur);
            else {
                cur =new Node(word.charAt(0));
                root.children.add(cur);
                addword(word.substring(1),cur);
            }
        }
    
        // 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 search(word,root);
        }
        private boolean search(String word,Node root){
            if(word.length()==0){
                return root.isEnd==true;
            }
            if(root.children==null) return false;
            if(word.charAt(0)=='.'){
                for(Node node:root.children){
                    boolean ret=search(word.substring(1),node);
                    if(ret) return true;
                }
                return false;
            }else{
                for(Node node:root.children){
                    if(node.val==word.charAt(0)){
                        return search(word.substring(1),node);
                    }
                }
                return false;
            }
            
        }
    }
    
    // Your WordDictionary object will be instantiated and called as such:
    // WordDictionary wordDictionary = new WordDictionary();
    // wordDictionary.addWord("word");
    // wordDictionary.search("pattern");
  • 相关阅读:
    VS操作Sqlite数据库
    Sqlite官方下载对应版本注意细节
    样式
    移动端问题
    table最终版IE(浏览器中宽度不起作用)
    pointer-event:none;在IE浏览器中不起作用
    伪类的使用
    针对谷歌浏览器写的css样式
    IE浏览器中textarea有滚动条出现
    父级元素被子元素的margin-top值影响的解决方案
  • 原文地址:https://www.cnblogs.com/qiaomu/p/4706014.html
Copyright © 2011-2022 走看看