zoukankan      html  css  js  c++  java
  • LeetCode211: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
    Note:
    You may assume that all words are consist of lowercase letters a-z.

    Trie这样的数据结构能够非常方便的实现字符串的查找,它的时间复杂度仅仅有O(L)。依据最以下的提示单词中仅仅有a-z的小写字母这个提示也能够想到使用Trie。
    前面Trie的实现使用的递归实现的,这次尝试使用非递归实现。
    主要的数据结构TrieNode也做了一些改变,由于不须要进行统计计数,仅仅须要推断是否存在以某个节点结尾的字符串,所以使用一个标示量来推断是否存在以该字符结尾的字符串就可以。
    搜索字符串使用的是递归,要是没有’.’这个字符可能用非递归也比較好实现,可是加上’.’这个字符后用非递归想了会儿没想出了可是感觉用递归会非常easy求解。
    最后须要注意的是node节点的含义是字符的父节点。由于Trie树的根节点是一个空字符。
    runtime:100ms

    class WordDictionary {
    public:
        class TrieNode
        {
            public:
            TrieNode * edges[26];//子节点
            bool end;//标示是否有以这个节点结尾的字符串
            TrieNode(){
                for(int i=0;i<26;i++)
                {
                    edges[i]=NULL;
                }
                end=false;
            }
        };
    
        class Trie
        {
            public:
                Trie(){
                    root=new TrieNode();
                }
                //加入单词使用循环实现,也能够使用递归,前面创建Trie树即使用的是递归
                void addWord(string word)
                {
                    if(word.empty())
                        return ;
    
                    TrieNode * node=root;
                    int pos=0;
                    while(pos<word.size())
                    {
                        int char_code=word[pos]-'a';
                        if(node->edges[char_code]!=NULL)
                        {
                            node=node->edges[char_code];
                            pos++;
                        }
                        else
                        {
                            node->edges[char_code]=new TrieNode();
                            node=node->edges[char_code];
                            pos++;
                        }
                    }
                    node->end=true;
                }
    
                //搜索使用递归实现,要是没有'.'使用循环也非常easy实现,可是加上限制条件后使用递归更easy一些
                bool search(string &word,int pos,TrieNode * node)
                {
                    if(word.empty()&&node->end)
                        return true;
    
                    int char_code=word[pos]-'a';
                    if(pos==word.size()&&node->end)
                        return true;
    
                    if(char_code=='.'-'a')
                    {
                        for(int i=0;i<26;i++)
                            if(node->edges[i]!=NULL&&search(word,pos+1,node->edges[i]))
                                return true;
                    }
                    else 
                    {
                        if(node->edges[char_code]!=NULL)
                            return search(word,pos+1,node->edges[char_code]);
                    }
                }
              TrieNode * root;  
    
        };
    
        // Adds a word into the data structure.
        void addWord(string word) {
            trie.addWord(word);
        }
    
        // Returns if the word is in the data structure. A word could
        // contain the dot character '.' to represent any one letter.
        bool search(string word) {
            return trie.search(word,0,trie.root);
        }
    
        private:
           Trie trie;
    };
    
    
    // Your WordDictionary object will be instantiated and called as such:
    // WordDictionary wordDictionary;
    // wordDictionary.addWord("word");
    // wordDictionary.search("pattern");
  • 相关阅读:
    进入正在运行的Docker的asp.net core容器
    EF 更新记录发现外键更改但更新又跳回以前值
    远程获取http数据和提交数据
    C# 32位16进制加密
    netcore命令行运行程序
    MD5加密32位16进制
    C# MD5加密32位16进制有时少一位问题
    netcoreMVC中使用Vue模板分页封装(不适合数据量大)
    Vue组件间传值 和 访问
    jenkins部署安装
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7074168.html
Copyright © 2011-2022 走看看