第29天。
今天的题目是Add and Search Word - Data structure design:
一道字典树的题目,如果知道字典树是怎样的话,应该不难做。不过这道题直接套字典树是不行的,因为它需要支持 . 字符来标识任意字符,所以我们在Search的时候需要做一定的修改。
简单的来说就是原本用一个指针进行搜索,现在需要一个队列来维护多个指针进行搜索,恩,仅此而已。代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
   | class TrieNode{      public:     char c;     vector<TrieNode*> childs;     bool flag;     TrieNode(char _c):c(_c),childs(26, nullptr),flag(false) {     }     TrieNode *addChild(char c) {         if (childs[c - 'a']) return childs[c - 'a'];         else return childs[c - 'a'] = new TrieNode(c);     } };
  class WordDictionary {     TrieNode *root; public:          WordDictionary():root(new TrieNode('?')) {              }               void addWord(string word) {                  TrieNode *p = root;         for(auto c: word) {             p = p->addChild(c);         }         p->flag = true;     }               bool search(string word) {                  queue<TrieNode *> q;         q.push(root);         for(auto c: word) {             if (q.empty()) return false;                          if (c == '.') {                 for(int i = 0,size = q.size();i < size; i++) {                     TrieNode *p = q.front(); q.pop();                     for(int j = 0;j < 26;j++) {                         if (p->childs[j]) q.push(p->childs[j]);                     }                 }             } else {                 for(int i = 0,size = q.size();i < size; i++) {                     TrieNode *p = q.front(); q.pop();                     if (p->childs[c - 'a']) q.push(p->childs[c - 'a']);                 }             }         }         while(!q.empty()) {             if (q.front()->flag) return true;             q.pop();         }         return false;     } };
  |