1. 题意
让你实现一个前缀树
实现Trie
2. 题解
需要有一个标记是否到达字符末端的isEnd
,和指向子节点的索引数组。
- 代码
class Trie {
public:
Trie():isEnd(false){
for ( int i = 0; i < 26;++i)
child[i] = nullptr;
}
~Trie() {
for ( int i = 0; i < 26; ++i ) {
if (child[i]) {
delete child[i];
child[i] = nullptr;
}
}
}
void insert(string word) {
Trie *cur = this;
int sz = word.size();
for (int i = 0; i < sz; ++i) {
int idx = word[i] - 'a';
if ( cur->child[idx] == nullptr) {
Trie *nxt = new Trie();
cur->child[idx] = nxt;
}
cur = cur->child[idx];
}
cur->isEnd = true;
}
bool search(string word) {
Trie *cur = this;
int sz = word.size();
for (int i = 0; i < sz; ++i) {
int idx = word[i] - 'a';
if (cur->child[idx] == nullptr)
return false;
cur = cur->child[idx];
}
return cur->isEnd;
}
bool startsWith(string prefix) {
int sz = prefix.size();
Trie *cur = this;
for (int i = 0; i < sz; ++i ) {
int idx = prefix[i] - 'a';
if (cur->child[idx] == nullptr)
return false;
cur = cur->child[idx];
}
return true;
}
private:
bool isEnd;
Trie *child[26];
};
/**
* 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);
*/