Implement Trie (Prefix Tree)
Implement a trie with insert
, search
, and startsWith
methods.
Note:
You may assume that all inputs are consist of lowercase letters a-z
.
Analyse: For each node, it has 26 children, from a-z.
1. For the string insertion operation, the procedure is:
--Set root as the temp node;
--For every character in the string, compute its corresponding place at the branch, and mark them.
--After all characters are marked, set isVal to indicate it's a value rather than a prefix.
2. For the search operation, the procedure is:
--Set root as the temp node;
--For every character in the string, continuously check the existance of it. If NULL node encountered, jump out the of loop.
--If the node is empty, then return false; Else, we need to judge whether this string is a value or a prefix.
3. For the startWith operation, it's quite similiar to the search operation except that all search operations with true result returned can return true in the start operation.
Runtime: 64ms.
1 class TrieNode { 2 public: 3 // Initialize your data structure here. 4 TrieNode* childNode[26]; 5 bool isVal;//to indicate whether the leaf node is the target word or the prefix 6 TrieNode() { 7 isVal = false; 8 for(int i = 0; i < 26; i++) 9 childNode[i] = NULL; 10 } 11 }; 12 13 class Trie { 14 public: 15 Trie() { 16 root = new TrieNode(); 17 } 18 19 // Inserts a word into the trie. 20 void insert(string word) { 21 TrieNode* temp = root; 22 for(int i = 0; i < word.size(); i++){ 23 if(temp->childNode[word[i] - 'a'] == NULL) 24 temp->childNode[word[i] - 'a'] = new TrieNode(); 25 temp = temp->childNode[word[i] - 'a']; 26 } 27 temp->isVal = true; //if the word is inserted, then isVal is true 28 } 29 30 // Returns if the word is in the trie. 31 bool search(string word) { 32 TrieNode* temp = root; 33 for(int i = 0; i < word.size(); i++){ 34 if(temp == NULL) break; 35 temp = temp->childNode[word[i] - 'a']; 36 } 37 if(!temp) return false; //if the route does not exist, return false 38 return temp->isVal; 39 } 40 41 // Returns if there is any word in the trie 42 // that starts with the given prefix. 43 bool startsWith(string prefix) { 44 TrieNode* temp = root; 45 for(int i = 0; i < prefix.size(); i++){ 46 if(temp == NULL) break; 47 temp = temp->childNode[prefix[i] - 'a']; 48 } 49 if(temp) 50 return true; //if the route exists, return true 51 else 52 return false; //if the route doesn't exists, return false 53 } 54 55 private: 56 TrieNode* root; 57 }; 58 59 // Your Trie object will be instantiated and called as such: 60 // Trie trie; 61 // trie.insert("somestring"); 62 // trie.search("key");