[LeetCode] Add and Search Word - Data structure design
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
.
字典树,注意匹配 '.' 的时候要对所有的子树进行匹配,这时就得用DFS了。
1 class WordDictionary { 2 private: 3 struct trinode { 4 trinode *ch[26]; 5 bool iskey; 6 trinode(): iskey(false) { 7 for (auto &a : ch) a = NULL; 8 } 9 }; 10 11 trinode *root; 12 13 void _addWord(string s) { 14 trinode *p = root; 15 for (auto &a : s) { 16 int idx = a - 'a'; 17 if (p->ch[idx] == NULL) p->ch[idx] = new trinode(); 18 p = p->ch[idx]; 19 } 20 p->iskey = true; 21 } 22 23 bool _search(trinode *root, string s, int pos) { 24 if (pos == s.length()) return root->iskey; 25 if (s[pos] == '.') { 26 for (auto &p : root->ch) { 27 if (p != NULL && _search(p, s, pos + 1)) return true; 28 } 29 return false; 30 } else { 31 int idx = s[pos] - 'a'; 32 return (root->ch[idx] && _search(root->ch[idx], s, pos + 1)); 33 } 34 } 35 36 public: 37 WordDictionary() { 38 root = new trinode(); 39 } 40 // Adds a word into the data structure. 41 void addWord(string word) { 42 _addWord(word); 43 } 44 45 // Returns if the word is in the data structure. A word could 46 // contain the dot character '.' to represent any one letter. 47 bool search(string word) { 48 return _search(root, word, 0); 49 } 50 }; 51 52 // Your WordDictionary object will be instantiated and called as such: 53 // WordDictionary wordDictionary; 54 // wordDictionary.addWord("word"); 55 // wordDictionary.search("pattern");
搜索的时候可以只有遇到 '.' 的时候才递归,否则就迭代。可以提高一点点效率。
1 bool _search(trinode *root, string s, int pos) { 2 if (pos == s.length()) return root->iskey; 3 trinode *p = root; 4 for (; pos < s.length(); ++pos) { 5 if (s[pos] != '.') { 6 int idx = s[pos] - 'a'; 7 if (p->ch[idx] == NULL) return false; 8 p = p->ch[idx]; 9 } else { 10 for (int idx = 0; idx < 26; ++idx) { 11 if (p->ch[idx] && __search(p->ch[idx], s, pos + 1)) return true; 12 } 13 return false; 14 } 15 } 16 return p->iskey; 17 }