定义
前缀树又叫做字典树或者单词查找树,给定字符串可以快速地实现该字符串是否存在于该前缀树中。
应用场景
给定一个字符串集合构建一棵前缀树,然后给一个字符串,判断前缀树中是否存在该字符串或者该字符串的前缀
基于链表的形式实现
- 数据结构:
// 前缀树的数据结构
private class TireNode {
boolean val;
TireNode[] tireNodes = new TireNode[26];
}
- 每个节点下面都有26个节点,表示存储的26个字母,每个节点不断地向下扩展,就可以以树状的形式表示一个字符串;
- 其中val表示前缀树中存储的某个字符串的终点,表示该字符串真正存储到前缀树中。
- 插入方法
// 前缀树的插入方法
public void insert(String word) {
TireNode tireNode = root;
for (char c : word.toCharArray()) {
int idx = c - 'a';
if (tireNode.tireNodes[idx] == null) {
tireNode.tireNodes[idx] = new TireNode();
}
tireNode = tireNode.tireNodes[idx];
}
tireNode.val = true;
}
计算下标位置(表示字母的位置),然后判空,若不为空,则继续向下插入;若为空,则创建节点继续向下插入即可。
- 查询方法
// 前缀树的查询方法
public boolean query(String word) {
TireNode tireNode = root;
for (char c : word.toCharArray()) {
int idx = c - 'a';
if (tireNode.tireNodes[idx] == null) {
return false;
}
tireNode = tireNode.tireNodes[idx];
}
return tireNode.val;
}
此处的关键是要返回最后节点的val值,如果为false,则表示该字符串不在前缀树中(可能是别的字符串的前缀而已),为true才表示该字符串真正存在;
- 查询某个字符串的最短前缀
// 查询某个字母的最短前缀
public String searchMinPrefix(String word) {
TreeNode temp = root;
StringBuilder stringBuilder = new StringBuilder();
for (char c : word.toCharArray()) {
if (temp.val) {
return stringBuilder.toString();
}
int idx = c - 'a';
stringBuilder.append(c);
if (temp.nodes[idx] == null) {
return word;
}
temp = temp.nodes[idx];
}
}