题目
简易字典树
题目给定了只有 26 个小写字母,因此就用了固定的数组指针,还可以用 vector 进行优化。
class Trie {
public:
Trie() {
root = new trie;
for(int j = 0; j < 26; ++j)
root->point[j] = nullptr;
}
void insert(string word) {
trie *p = root;
for(int i = 0; i < word.size(); ++i) {
if(i == 0 && p->point[word[i] - 'a'] == nullptr) {
trie *tmp = new trie;
tmp->isEnd = false;
for(int j = 0; j < 26; ++j)
tmp->point[j] = nullptr;
p->point[word[i] - 'a'] = tmp;
p = tmp;
continue;
}
if(p->point[word[i] - 'a'])
p = p->point[word[i] - 'a'];
else {
trie *tmp = new trie;
tmp->isEnd = false;
for(int j = 0; j < 26; ++j)
tmp->point[j] = nullptr;
p->point[word[i] - 'a'] = tmp;
p = tmp;
}
}
p->isEnd = true;
}
bool search(string word) {
trie *p = root;
for(int i = 0; i < word.size(); ++i)
if(p->point[word[i] - 'a'] == nullptr)
return false;
else p = p->point[word[i] - 'a'];
if(p->isEnd)
return true;
else return false;
}
bool startsWith(string prefix) {
trie *p = root;
for(int i = 0; i < prefix.size(); ++i) {
if(p->point[prefix[i] - 'a'] == nullptr)
return false;
else p = p->point[prefix[i] - 'a'];
}
return true;
}
private:
struct trie {
bool isEnd;
trie *point[26];
};
trie *root;
};