Implement a trie with insert
, search
, and startsWith
methods.
Note:
You may assume that all inputs are consist of lowercase letters a-z
.
这道题是实现字典树,题目难度为Medium。
可能还有同学不太了解字典树,不了解的同学可以先看下字典树在wiki上的页面(传送门)。字典树的优点是插入和查找的时间复杂度为O(m),m为单词长度,但空间复杂度比较庞大。看到一篇介绍Trie的博文写的比较详细,建议不了解字典树的同学也详细看一看(传送门)。
Trie没有析构函数,这里是需要析构函数的,所以加入了采用深度优先搜索的析构函数。其他部分应该没什么难度了,具体代码:
class TrieNode {
public:
vector<TrieNode*> child;
bool isIn;
// Initialize your data structure here.
TrieNode() : child(vector<TrieNode*>(26, NULL)), isIn(false) {}
};
class Trie {
public:
Trie() : root(new TrieNode()) {}
~Trie() {
delNode(root);
}
void delNode(TrieNode* n) {
for(int i=0; i<26; ++i) {
if(n->child[i]) delNode(n->child[i]);
}
delete n;
}
// Inserts a word into the trie.
void insert(string word) {
TrieNode* n = root;
for(auto ch:word) {
if(n->child[ch-'a'] == NULL)
n->child[ch-'a'] = new TrieNode();
n = n->child[ch-'a'];
}
n->isIn = true;
}
// Returns if the word is in the trie.
bool search(string word) {
TrieNode* n = root;
for(auto ch:word) {
if(n->child[ch-'a'] == NULL) return false;
n = n->child[ch-'a'];
}
return n->isIn;
}
// Returns if there is any word in the trie
// that starts with the given prefix.
bool startsWith(string prefix) {
TrieNode* n = root;
for(auto ch:prefix) {
if(n->child[ch-'a'] == NULL) return false;
n = n->child[ch-'a'];
}
return true;
}
private:
TrieNode* root;
};
// Your Trie object will be instantiated and called as such:
// Trie trie;
// trie.insert("somestring");
// trie.search("key");