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;
}
};