Implement a trie with insert
, search
, and startsWith
methods.
Note:
You may assume that all inputs are consist of lowercase letters a-z
.
class TrieNode {
public:
// Initialize your data structure here.
TrieNode(char input = '#'): isEnd(false)
{
}
bool isEnd;
unordered_map<char, TrieNode*> child;
};
class Trie {
public:
Trie() {
root = new TrieNode();
}
// Inserts a word into the trie.
void insert(string word) {
TrieNode *iter = root;
for(int i = 0; i < word.size(); i++)
{
if(iter->child.find(word[i]) != iter->child.end())
{
iter = iter->child[word[i]];
}
else
{
TrieNode *temp = new TrieNode(word[i]);
iter->child[word[i]] = temp;
iter = temp;
}
}
iter->isEnd = true;
}
// Returns if the word is in the trie.
bool search(string word) {
TrieNode *iter = root;
for(int i = 0; i < word.size(); i++)
{
if(iter->child.find(word[i]) != iter->child.end())
{
iter = iter->child[word[i]];
}
else
{
return false;
}
}
if(iter->isEnd == true)
return true;
else
return false;
}
// Returns if there is any word in the trie
// that starts with the given prefix.
bool startsWith(string prefix) {
TrieNode *iter = root;
for(int i = 0; i < prefix.size(); i++)
{
if(iter->child.find(prefix[i]) != iter->child.end())
{
iter = iter->child[prefix[i]];
}
else
{
return false;
}
}
return true;
}
private:
TrieNode* root;
};
// Your Trie object will be instantiated and called as such:
// Trie trie;
// trie.insert("somestring");
// trie.search("key");