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:
char value;
bool isEnd;
int count;
vector<TrieNode*> children;
TrieNode() : value(' '), isEnd(false), count(0)
{}
TrieNode(char ch) : value(ch), isEnd(false), count(0)
{}
TrieNode* subNode(char ch)
{
for (vector<TrieNode*>::iterator it = children.begin(); it != children.end(); it++)
{
if ((*it)->value == ch)
{
return *it;
}
}
return NULL;
}
~TrieNode()
{
for (vector<TrieNode*>::iterator it = children.begin(); it != children.end(); it++)
{
delete *it;
}
}
};
class Trie {
public:
Trie() {
root = new TrieNode();
}
// Inserts a word into the trie.
void insert(string word) {
if (search(word))
{
return;
}
TrieNode *curr = root;
for (int i = 0; i < word.length(); i++)
{
TrieNode *child = curr->subNode(word[i]);
if (child == NULL)
{
TrieNode *temp = new TrieNode(word[i]);
curr->children.push_back(temp);
curr = temp;
}
else
{
curr = child;
}
curr->count++;
}
curr->isEnd = true;
}
// Returns if the word is in the trie.
bool search(string word) {
TrieNode *curr = root;
for (int i = 0; i < word.length(); i++)
{
curr = curr->subNode(word[i]);
if (curr == NULL)
{
return false;
}
}
return curr->isEnd;
}
// Returns if there is any word in the trie
// that starts with the given prefix.
bool startsWith(string prefix) {
TrieNode *curr = root;
for (int i = 0; i < prefix.length(); i++)
{
curr = curr->subNode(prefix[i]);
if (curr == NULL)
{
return false;
}
}
return true;
}
~Trie()
{
delete root;
}
private:
TrieNode* root;
};
// Your Trie object will be instantiated and called as such:
// Trie trie;
// trie.insert("somestring");
// trie.search("key");