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:100msclass 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(posedges[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");