Implement a trie with insert
, search
, and startsWith
methods.
Example:
Trie trie = new Trie(); trie.insert("apple"); trie.search("apple"); // returns true trie.search("app"); // returns false trie.startsWith("app"); // returns true trie.insert("app"); trie.search("app"); // returns true
/* 实现前缀树 每个节点下有一个26个指针(指向的位置不为空 则代表一个当前的字母)
* 同时要设置一个flag 判断是否到达末尾eg: app apple
*
* */
class Trie {
public:
/** Initialize your data structure here. */
class TrieNode{
public:
bool isEnd;
TrieNode *child[26];
TrieNode():isEnd(false){
for(auto &v :child){
v = NULL;
}
}
};
TrieNode *root;
Trie() {
root = new TrieNode();
}
/** Inserts a word into the trie. */
void insert(string word) {
// 沿路查找 不存在就创建 查到末尾时设置isEnd
TrieNode *tmp =root;
for(auto &s : word){
int pos = s-'a';
if(! (tmp->child[pos])) tmp->child[pos] = new TrieNode();
tmp = tmp->child[pos];
}
tmp->isEnd = true;
}
/** Returns if the word is in the trie. */
bool search(string word) {
// 从根节点一直查找玩整个word 并判断结尾是否为isEnd 否则就是startwith
TrieNode *tmp =root;
for(auto &s : word){
int pos = s-'a';
tmp = tmp->child[pos];
if(!tmp) return false;
}
return tmp->isEnd;
}
/** Returns if there is any word in the trie that starts with the given prefix. */
bool startsWith(string prefix) {
// 从根节点一直查找玩整个word 并判断结尾是否为isEnd 否则就是startwith
TrieNode *tmp =root;
for(auto &s : prefix){
int pos = s-'a';
tmp = tmp->child[pos];
if(!tmp) return false;
}
return true;
}
};