标签:
题目描述:
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
.
AC代码如下(时间:85ms
class TrieNode { public: // Initialize your data structure here. TrieNode(){ m_isWord = false; for (int i = 0; i < 26; ++i){ next[i] = NULL; } } void setIsWord(bool isWord){ m_isWord = isWord; } bool getIsWord(void){ return m_isWord; } public: bool m_isWord; TrieNode* next[26]; }; class WordDictionary { public: WordDictionary(){ root = new TrieNode(); } // Adds a word into the data structure. void addWord(string word) { int len = word.length(); if (len == 0) return; TrieNode* p = root; for (int i = 0; i < len; ++i){ if (p->next[word[i] - 'a'] == NULL){ p->next[word[i] - 'a'] = new TrieNode(); p = p->next[word[i] - 'a']; } else{ p = p->next[word[i] - 'a']; } } p->setIsWord(true); } bool search(string word){ return search(word, 0, root); } // Returns if the word is in the data structure. A word could // contain the dot character '.' to represent any one letter. bool search(const string& word,int curIndex,TrieNode* curNode) { if (curIndex == word.length()) return curNode->getIsWord(); if (word[curIndex] == '.'){ bool res = false; for (int i = 0; i < 26; ++i){ if (curNode->next[i] != NULL){ res = search(word, curIndex + 1, curNode->next[i]); if (res) return true; } } return false; } else{ if (curNode->next[word[curIndex] - 'a'] != NULL){ return search(word, curIndex + 1, curNode->next[word[curIndex] - 'a']); } else{ return false; } } } private: TrieNode* root; };
标签:
原文地址:http://blog.csdn.net/lyh642784803/article/details/51345992