LeetCode-208. Implement Trie (Prefix Tree)
原创
©著作权归作者所有:来自51CTO博客作者ReignsDu的原创作品,请联系作者获取转载授权,否则将追究法律责任
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
Note:
- You may assume that all inputs are consist of lowercase letters
a-z
. - All inputs are guaranteed to be non-empty strings.
题解:
class Trie {
struct trieTree {
trieTree* child[26];
bool isWord;
bool hasPrefix;
trieTree() {
for (int i = 0; i < 26; i++) {
child[i] = NULL;
}
isWord = false;
hasPrefix = false;
}
};
trieTree *root;
public:
/** Initialize your data structure here. */
Trie() {
root = new trieTree();
}
/** Inserts a word into the trie. */
void insert(string word) {
trieTree *t = root;
for (int i = 0; i < word.size(); i++) {
if (t->child[word[i]- 'a'] == NULL) {
t->child[word[i] - 'a'] = new trieTree();
t->hasPrefix = true;
}
t = t->child[word[i] - 'a'];
}
t->isWord = true;
t->hasPrefix = true;
}
/** Returns if the word is in the trie. */
bool search(string word) {
trieTree *t = root;
for (int i = 0; i < word.size(); i++) {
if (t->child[word[i]- 'a'] == NULL) {
return false;
}
t = t->child[word[i] - 'a'];
}
return t->isWord;
}
/** Returns if there is any word in the trie that starts with the given prefix. */
bool startsWith(string prefix) {
trieTree *t = root;
for (int i = 0; i < prefix.size(); i++) {
if (t->child[prefix[i]- 'a'] == NULL) {
return false;
}
t = t->child[prefix[i] - 'a'];
}
return t->hasPrefix;
}
};