博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode211:Add and Search Word - Data structure design
阅读量:6243 次
发布时间:2019-06-22

本文共 3186 字,大约阅读时间需要 10 分钟。

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
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");

转载地址:http://cfpia.baihongyu.com/

你可能感兴趣的文章
Docker源码分析(一):Docker架构
查看>>
Android开发之在子线程中使用Toast
查看>>
(第三天)函数
查看>>
Git 学习笔记--Git下的冲突解决
查看>>
poj 2955 Brackets(区间dp)
查看>>
jQuery选中该复选框来实现/全部取消/未选定/获得的选定值
查看>>
武汉Uber优步司机奖励政策(8月31日~9月6日)
查看>>
javascript小技巧:同步服务器时间、同步倒计时
查看>>
JUnit4.8.2来源分析-2 org.junit.runner.Request
查看>>
你觉得你在创业,但其实你可能只是在做小生意而已 制定正确的计划 创业和经营小企业之间的差异...
查看>>
HDU 4847-Wow! Such Doge!(定位)
查看>>
冒泡排序算法 C++和PHP达到
查看>>
Android 弹出通知Toast的使用
查看>>
jquery $.each遍历json数组方法
查看>>
jquery access方法 有什么用
查看>>
更改IOS于UISearchBar撤消button底、搜索输入文本框背景中的内容和UISearchBar底
查看>>
WPF XAML之bing使用StringFormat(转)
查看>>
Mysql备份工具比较
查看>>
python之函数用法getattr()
查看>>
Asp.Net 之 未能加载文件或程序集 system.web.extensions 解决方法
查看>>