208.實現Trie(字首樹)
實現一個 Trie (字首樹),包含 insert
, search
, 和 startsWith
這三個操作。
示例:
Trie trie = new Trie(); trie.insert("apple"); trie.search("apple"); // 返回 true trie.search("app"); // 返回 false trie.startsWith("app"); // 返回 true trie.insert("app"); trie.search("app"); // 返回 true
說明:
- 你可以假設所有的輸入都是由小寫字母
a-z
構成的。 - 保證所有輸入均為非空字串。
class TrieNode { public: // Initialize your data structure here. TrieNode *child[26]; bool isWord; TrieNode() : isWord(false){ for (auto &a : child) a = NULL; } }; class Trie { public: /** Initialize your data structure here. */ Trie() { root = new TrieNode(); } /** Inserts a word into the trie. */ void insert(string word) { TrieNode *p = root; for (auto &a : word) { int i = a - 'a'; if (!p->child[i]) p->child[i] = new TrieNode(); p = p->child[i]; } p->isWord = true; } /** Returns if the word is in the trie. */ bool search(string word) { TrieNode *p = root; for (auto &a : word) { int i = a - 'a'; if (!p->child[i]) return false; p = p->child[i]; } return p->isWord; } /** Returns if there is any word in the trie that starts with the given prefix. */ bool startsWith(string prefix) { TrieNode *p = root; for (auto &a : prefix) { int i = a - 'a'; if (!p->child[i]) return false; p = p->child[i]; } return true; } /*void Delete(TrieNode *p) { for(int i=0;i<26;i++) { if(p->child[i] != NULL) Delete(p->child[i]); } delete p; } ~Trie() { if(root != NULL) Delete(root); }*/ private: TrieNode* root; };
/** * Your Trie object will be instantiated and called as such: * Trie obj = new Trie(); * obj.insert(word); * bool param_2 = obj.search(word); * bool param_3 = obj.startsWith(prefix); */