每个字符沿 next[26] 走,节点维护终点标记。
OJ: leetcodecn
题目 ID: implement-trie-prefix-tree
难度:普及+/提高
标签:Trie字典树设计cpppython
日期: 2026-07-29 13:10
题意
实现 Trie(前缀树),支持 insert、search、startsWith。
思路
每个节点有 26 个子节点指针(或哈希表),isEnd 标记是否存在完整单词。
代码
cpp
#include <bits/stdc++.h>
using namespace std;
class Trie {
array<Trie *, 26> next = {};
bool end = false;
public:
Trie() {}
void insert(string word) {
auto cur = this;
for (char ch : word) {
int c = ch - 'a';
if (!cur->next[c])
cur->next[c] = new Trie();
cur = cur->next[c];
}
cur->end = true;
}
bool search(string word) {
auto cur = this;
for (char ch : word) {
int c = ch - 'a';
if (!cur->next[c])
return false;
cur = cur->next[c];
}
return cur->end;
}
bool startsWith(string prefix) {
auto cur = this;
for (char ch : prefix) {
int c = ch - 'a';
if (!cur->next[c])
return false;
cur = cur->next[c];
}
return true;
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int q;
cin >> q;
Trie trie;
while (q--) {
string op, s;
cin >> op >> s;
if (op == "insert")
trie.insert(s);
else if (op == "search")
cout << trie.search(s) << ' ';
else
cout << trie.startsWith(s) << ' ';
}
return 0;
}python
#!/usr/bin/env python3
class Trie:
def __init__(self):
self.next = {}
self.end = False
def insert(self, word: str) -> None:
cur = self
for ch in word:
if ch not in cur.next:
cur.next[ch] = Trie()
cur = cur.next[ch]
cur.end = True
def search(self, word: str) -> bool:
cur = self
for ch in word:
if ch not in cur.next:
return False
cur = cur.next[ch]
return cur.end
def startsWith(self, prefix: str) -> bool:
cur = self
for ch in prefix:
if ch not in cur.next:
return False
cur = cur.next[ch]
return True
def main():
q = int(input())
t = Trie()
for _ in range(q):
op, s = input().split()
if op == "insert":
t.insert(s)
elif op == "search":
print(t.search(s), end=" ")
else:
print(t.startsWith(s), end=" ")
if __name__ == "__main__":
main()复杂度
插入/查询 O(len),空间 O(总字符数 * 26)。
总结
Trie 用空间换时间,适合前缀匹配和词频统计。