class Trie {
private static final int MAXN = 150001;
private int[][] tree;
private int[] end, pass;
private int cnt;
public Trie() {
tree = new int[MAXN][26];
end = new int[MAXN];
pass = new int[MAXN];
cnt = 1;
}
public void insert(String word) {
int cur = 1;
pass[cur]++;
for (int i = 0, path; i < word.length(); i++) {
path = word.charAt(i) - 'a';
if (tree[cur][path] == 0) {
tree[cur][path] = ++cnt;
}
cur = tree[cur][path];
pass[cur]++;
}
end[cur]++;
}
public boolean search(String word) {
int cur = 1;
for (int i = 0, path; i < word.length(); i++) {
path = word.charAt(i) - 'a';
if (tree[cur][path] == 0) {
return false;
}
cur = tree[cur][path];
}
return end[cur] > 0;
}
public boolean startsWith(String prefix) {
int cur = 1;
for (int i = 0, path; i < prefix.length(); i++) {
path = prefix.charAt(i) - 'a';
if (tree[cur][path] == 0) {
return false;
}
cur = tree[cur][path];
}
return pass[cur] > 0;
}
public void delete(String word) {
if (search(word)) {
int cur = 1;
pass[cur]--;
for (int i = 0, path; i < word.length(); i++) {
path = word.charAt(i) - 'a';
if (--pass[tree[cur][path]] == 0) {
tree[cur][path] = 0;
return;
}
cur = tree[cur][path];
}
end[cur]--;
}
}
public void clear() {
for (int i = 0; i < MAXN; i++) {
Arrays.fill(tree[i], 0);
end[i] = 0;
pass[i] = 0;
}
cnt = 1;
}
}
前缀树java静态实现
于 2025-03-22 14:53:07 首次发布