难度:中等。
标签:设计,字典树。
一开始将每个节点的孩子节点乱序存储,不是按照字母顺序存储的(哈希表)。即字母c的索引不是int(c - ‘a’)。
提交后13/15用例竟然错了,那个用例很长,没法去排查,debug半天也不知道为什么。
结果错误代码:
struct TrieNode{
vector<TrieNode*> next;
bool end;
char val;
TrieNode(char c):val(c), end(false){
};
};
class Trie {
TrieNode* root;
public:
/** Initialize your data structure here. */
Trie() {
root = new TrieNode(' ');
}
/** Inserts a word into the trie. */
void insert(string word) {
TrieNode* cur = root;
for(int i = 0; i < word.length(); ++i){
int find = 0;
for(int j = 0; j < cur->next.size(); ++j){
if(cur->next[j]->val == word[i]){
cur = cur->next[j];
find = 1;
}
}
if(!find){
TrieNode* temp = new TrieNode(word[i]);
cur->next.emplace_back(temp);
cur = temp;
}
}
cur->end = true;
}
/** Returns if the word is in the trie. */
bool search(string word) {
TrieNode* cur = root;
for(int i = 0; i < word.length(); ++i){
int find = 0;
for(int j = 0; j < cur->next.size(); ++j){
if(cur->next[j]->val == word[i]){
cur = cur->next[j];
find = 1;
}
}
if(!find)return false;
}
return cur->end;
}
/** Returns if there is any word in the trie that starts with the given prefix. */
bool startsWith(string prefix) {
TrieNode* cur = root;
for(int i = 0; i < prefix.length(); ++i){
int find = 0;
for(int j = 0; j < cur->next.size(); ++j){
if(cur->next[j]->val == prefix[i]){
cur = cur->next[j];
find = 1;
}
}
if(!find)return false;
}
return true;
}
};
/**
* 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);
*/
将孩子节点的vector变为哈希表,按照字母顺序排列,提交通过了。
所以上述错误的原因可能是vector在插入时或查找时的一些问题。
正确结果:
struct TrieNode{
vector<TrieNode*> next;
bool end;
char val;
TrieNode(char c):val(c), end(false), next(26){
};
};
class Trie {
TrieNode* root;
public:
/** Initialize your data structure here. */
Trie() {
root = new TrieNode(' ');
}
/** Inserts a word into the trie. */
void insert(string word) {
TrieNode* cur = root;
for(int i = 0; i < word.length(); ++i){
int index = word[i] - 'a';
if(cur->next[index] == nullptr){
cur->next[index] = new TrieNode(word[i]);
cur = cur->next[index];
}
else{
cur = cur->next[index];
}
}
cur->end = true;
}
/** Returns if the word is in the trie. */
bool search(string word) {
TrieNode* cur = root;
for(int i = 0; i < word.length(); ++i){
int index = word[i] - 'a';
if(cur->next[index] == nullptr){
return false;
}
else{
cur = cur->next[index];
}
}
return cur->end;
}
/** Returns if there is any word in the trie that starts with the given prefix. */
bool startsWith(string prefix) {
TrieNode* cur = root;
for(int i = 0; i < prefix.length(); ++i){
int index = prefix[i] - 'a';
if(cur->next[index] == nullptr){
return false;
}
else{
cur = cur->next[index];
}
}
return true;
}
};
/**
* 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);
*/
结果: