🧩Algo 图论
208. 实现 Trie(前缀树)
难度:🟡 Medium | 标签:图论、Trie、设计 | 状态:⬜ LeetCode 链接
思路
每个节点存 children[26] + end 标志。
insert / search / startsWith 都是逐字符走树,区别只是终止判断。
代码
class Trie {
struct Node {
Node* ch[26] = {};
bool end = false;
};
Node root;
public:
void insert(string word) {
Node* p = &root;
for (char c : word) {
int i = c - 'a';
if (!p->ch[i]) p->ch[i] = new Node();
p = p->ch[i];
}
p->end = true;
}
Node* find(const string& s) {
Node* p = &root;
for (char c : s) {
int i = c - 'a';
if (!p->ch[i]) return nullptr;
p = p->ch[i];
}
return p;
}
bool search(string word) { auto* p = find(word); return p && p->end; }
bool startsWith(string prefix) { return find(prefix) != nullptr; }
};
复杂度
insert / search / startsWith都是 O(L)- 空间 O(总字符数 × 26)
易错 / 回顾
search要求完整词,所以判endstartsWith只需路径存在- 节点用
unordered_map<char, Node*>更省空间但更慢
Related · 图论