1. 题目
![在这里插入图片描述](https://img-blog.csdnimg.cn/c535e67a795349f49ea30ecc66039437.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA6Zi_6LSi57un57ut5Yqq5Yqb,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
2. 思路
(1) 前缀树
- 定义前缀树结点的数据结构,每个结点包含结点值和长度为26的子结点数组,可以将其看作26叉树。
- 插入单词时,从根结点开始遍历,寻找下一个单词对应的子结点,若该子结点未实例化,则实例化该子结点,然后调用该子结点的插入方法,当单词全部插入到树中时,更新当前结点的结点值。
- 搜索单词时,先找到前缀字符串的最后一个字符对应的结点,对该结点进行深度优先搜索,若某个子结点的结点值不为0,则表示该子结点是某个单词的结尾,将该结点值加入结果中即可。
3. 代码
public class Test {
public static void main(String[] args) {
}
}
class MapSum {
private TreeNode root;
public MapSum() {
root = new TreeNode();
}
public void insert(String key, int val) {
root.insert(key, 0, val);
}
public int sum(String prefix) {
TreeNode cur = root;
for (int i = 0; i < prefix.length(); i++) {
cur = cur.children[prefix.charAt(i) - 'a'];
if (cur == null) {
return 0;
}
}
return cur.dfs();
}
}
class TreeNode {
public int val;
public TreeNode[] children;
public TreeNode() {
val = 0;
children = new TreeNode[26];
}
public void insert(String key, int index, int val) {
if (index == key.length()) {
this.val = val;
return;
}
int letterIndex = key.charAt(index) - 'a';
if (children[letterIndex] == null) {
children[letterIndex] = new TreeNode();
}
children[letterIndex].insert(key, index + 1, val);
}
public int dfs() {
int sum = 0;
if (val > 0) {
sum += val;
}
for (int i = 0; i < 26; i++) {
if (children[i] != null) {
sum += children[i].dfs();
}
}
return sum;
}
}