LeetCode: 208. Implement Trie (Prefix Tree)
阿新 • • 發佈:2018-12-11
題目描述
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.
解題思路 —— 字典樹
根據字典樹的定義編碼。
AC 程式碼
class Trie {
private:
const static int CHILD_NODE_NUM = 27;
struct TrieNode
{
TrieNode* ch[CHILD_NODE_NUM];
size_t count;
TrieNode():count(0)
{
for(size_t i = 0; i < CHILD_NODE_NUM; ++i)
{
ch[i] = nullptr;
}
}
};
public:
/** Initialize your data structure here. */
Trie() {
root = new TrieNode();
}
/** Inserts a word into the trie. */
void insert(string word) {
insert(root, word, 0);
}
/** Returns if the word is in the trie. */
bool search(string word) {
return search(root, word, 0);
}
/** Returns if there is any word in the trie that starts with the given prefix. */
bool startsWith(string prefix) {
return startsWith(root, prefix, 0);
}
private:
void insert(TrieNode* r, string word, int idx)
{
int chIdx = CHILD_NODE_NUM-1;
if(word.size() < idx)
{
return;
}
else if(word.size() != idx)
{
chIdx = word[idx]-'a';
}
if(r->ch[chIdx] == nullptr)
{
r->ch[chIdx] = new TrieNode();
}
++(r->ch[chIdx]->count);
insert(r->ch[chIdx], word, idx+1);
}
bool search(TrieNode* r, string word, int idx)
{
int chIdx = CHILD_NODE_NUM-1;
if(word.size() < idx)
{
return r->count;
}
else if(word.size() != idx)
{
chIdx = word[idx]-'a';
}
if(r->ch[chIdx] == nullptr)
{
return false;
}
return search(r->ch[chIdx], word, idx+1);
}
bool startsWith(TrieNode* r, string word, int idx)
{
if(word.size() == idx)
{
return r->count;
}
if(r->ch[word[idx]-'a'] == nullptr)
{
return false;
}
return startsWith(r->ch[word[idx]-'a'], word, idx+1);
}
private:
TrieNode* root;
};
/**
* Your Trie object will be instantiated and called as such:
* Trie obj = new Trie();
* obj.insert(word);
* bool param_2 = obj.search(word);
* bool param_3 = obj.startsWith(prefix);
*/