[LeetCode] 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.

字典树,注意匹配 '.' 的时候要对所有的子树进行匹配,这时就得用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     }
原文地址:https://www.cnblogs.com/easonliu/p/4507917.html