Implement a trie with insert
, search
, and startsWith
methods.
Note:
You may assume that all inputs are consist of lowercase letters a-z
.
题目大意:实现Trie树的insert、search和startsWith方法。
解题思路:关键在于对Trie树的理解。在我的实现里,结构体TrieNode没有保存任何字符,因为我觉得如果某个节点的指针不为空,那么就说明代表该节点的字符存在。
代码如下:
#define MAXN 27
typedef struct TrieNode{
struct TrieNode* next[MAXN];
} Trie;
/** Initialize your data structure here. */
Trie* trieCreate() {
Trie* root = malloc(sizeof(Trie));
for(int i = 0;i < MAXN;i++){
root->next[i] = NULL;
}
return root;
}
/** Inserts a word into the trie. */
void trieInsert(Trie* obj, char* word) {
if(strlen(word) == 0){
obj->next[26] = trieCreate();
return ;
}
if(obj->next[*word - 'a'] == NULL){
obj->next[*word - 'a'] = trieCreate();
trieInsert(obj->next[*word - 'a'], word + 1);
}else{
trieInsert(obj->next[*word - 'a'], word + 1);
}
}
/** Returns if the word is in the trie. */
bool trieSearch(Trie* obj, char* word) {
if(strlen(word) == 0){
if(obj->next[26]) return true;
else return false;
}
if(obj->next[*word - 'a']) return trieSearch(obj->next[*word - 'a'], word + 1);
else return false;
}
/** Returns if there is any word in the trie that starts with the given prefix. */
bool trieStartsWith(Trie* obj, char* prefix) {
if(strlen(prefix) == 1){
if(obj->next[*prefix - 'a']) return true;
else return false;
}
if(obj->next[*prefix - 'a']) return trieStartsWith(obj->next[*prefix - 'a'], prefix + 1);
else return false;
}
void trieFree(Trie* obj) {
if(obj == NULL) return ;
for(int i = 0;i < MAXN;i++)
trieFree(obj->next[i]);
free(obj);
}
/**
* Your Trie struct will be instantiated and called as such:
* struct Trie* obj = trieCreate();
* trieInsert(obj, word);
* bool param_2 = trieSearch(obj, word);
* bool param_3 = trieStartsWith(obj, prefix);
* trieFree(obj);
*/