LeetCode211:Add and Search Word - Data structure design
2017-06-24 19:00
671 查看
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");
相关文章推荐
- LeetCode211:Add and Search Word - Data structure design
- LeetCode 211. Add and Search Word - Data structure design
- LeetCode 211. Add and Search Word - Data structure design
- [leetcode] 211. Add and Search Word - Data structure design 解题报告
- LeetCode208 Implement Trie (Prefix Tree). LeetCode211 Add and Search Word - Data structure design
- leetcode-211-Add and Search Word - Data structure design
- LeetCode 211. Add and Search Word - Data structure design(单词检索)
- LeetCode[211] Add and Search Word - Data structure design
- Leetcode 211 Add and Search Word - Data structure design
- LeetCode 211 Add and Search Word - Data structure design
- leetcode 211: Add and Search Word - Data Structure Design
- leetcode 211. Add and Search Word - Data structure design
- leetcode 211: Add and Search Word - Data structure design
- [leetcode] 211 Add and Search Word - Data structure design
- LeetCode(211) Add and Search Word - Data structure design
- LeetCode 211 - Add and Search Word - Data structure design
- Leetcode 211. Add and Search Word - Data structure design
- Leetcode211 - Add and Search Word - Data structure design
- leetcode:Trie:Add and Search Word - Data structure design(211)
- Leetcode 211. Add and Search Word - Data structure design