mplement a trie with insert
, search
, and startsWith
methods.
Note:
You may assume that all inputs are consist of lowercase letters a-z
.
关于前缀树的知识见https://en.wikipedia.org/wiki/Trie
因为题目中说道字母在a-z之间,所以我们可以采用26个子指针的方式,用一个unordered_map来记录指针,这样容易实现。
同时由于要实现search和prefix的操作,数据结构采用一个bool值记录是否是字符串的最后一个。代码如下。
class TrieNode {
public:
// Initialize your data structure here.
bool isword;
unordered_map<char,TrieNode* > children;
TrieNode():isword(false){};
};
class Trie {
public:
Trie() {
root = new TrieNode();
}
// Inserts a word into the trie.
void insert(string word) {
TrieNode* cur = root;
int len = word.length();
for(int i=0; i<len; ++i){
if(cur->children.find(word[i])==cur->children.end()){
cur->children[word[i]] = new TrieNode();
}
cur = cur->children[word[i]];
}
cur->isword = true;
}
// Returns if the word is in the trie.
bool search(string word) {
return retreive(word,false);
}
// Returns if there is any word in the trie
// that starts with the given prefix.
bool startsWith(string prefix) {
return retreive(prefix,true);
}
inline bool retreive(string & word,bool tag){
int len = word.length();
bool exist = true;
TrieNode *cur = root;
for(int i=0; i<len; ++i){
if(cur->children.find(word[i])==cur->children.end()){
return false;
}
cur = cur->children[word[i]];
}
return tag?exist:cur->isword;
}
private:
TrieNode* root;
};
// Your Trie object will be instantiated and called as such:
// Trie trie;
// trie.insert("somestring");
// trie.search("key");