題目:
實現一個 Trie (前綴樹),包含 insert, search, 和 startsWith 這三個操作。
示例:
Trie trie = new Trie();
trie.insert(“apple”);
trie.search(“apple”); // 返回 true
trie.search(“app”); // 返回 false trie.startsWith(“app”); // 返回 true
trie.insert(“app”); trie.search(“app”); // 返回 true
說明:
你可以假設所有的輸入都是由小寫字母 a-z 構成的。
保證所有輸入均爲非空字符串。
思路
每個TrieNode的子節點由26個字母 a-z 的子節點組成記錄單詞的一位字符,如果當前節點爲單詞最後一個字符,則當前節點的item值爲當前單詞,否則爲空。
代碼
class TrieNode {
public:
TrieNode* children[26];
string item = "";
};
class Trie {
private:
TrieNode* root;
public:
/** Initialize your data structure here. */
Trie() {
root = new TrieNode();
}
/** Inserts a word into the trie. */
void insert(string word) {
TrieNode* node = this->root;
for(int i = 0; i < word.length(); i++) {
if(node->children[word[i]-'a'] == NULL) {
node->children[word[i]-'a'] = new TrieNode();
}
node = node->children[word[i]-'a'];
}
node->item = word;
}
/** Returns if the word is in the trie. */
bool search(string word) {
TrieNode* node = this->root;
for(int i = 0; i < word.length(); i++) {
if(node->children[word[i]-'a'] == NULL) {
return false;
}
node = node->children[word[i]-'a'];
}
return node->item == word;
}
/** Returns if there is any word in the trie that starts with the given prefix. */
bool startsWith(string prefix) {
TrieNode* node = this->root;
for(int i = 0; i < prefix.length(); i++) {
if(node->children[prefix[i]-'a'] == NULL) {
return false;
}
node = node->children[prefix[i]-'a'];
}
return true;
}
};
輸出