题目链接
思路:字典树
分析:题目要求传入一个前缀,并且求出以该前缀开头的key的累加和,那么我们需要知道一些key的公共前缀,那么就可以套用字典树了,并且结构中还应该包含到达该位置的val。
代码:
class MapSum {
//字典树结构
class DistinctionTree{
char key;
int val;
DistinctionTree[] children = new DistinctionTree[26];
public DistinctionTree(char key){
this.key = key;
}
public DistinctionTree(){
}
}
//字典树的根
DistinctionTree root;
//初始化字典树的根
public MapSum() {
root = new DistinctionTree();
}
//字典树插入
public void insert(String key, int val) {
DistinctionTree p = root;
for(int i = 0; i < key.length();i++){
if(p.children[key.charAt(i)-'a']==null){
p.children[key.charAt(i)-'a'] = new DistinctionTree(key.charAt(i));
}
p = p.children[key.charAt(i)-'a'];
}
p.val = val;
}
public int sum(String prefix) {
DistinctionTree p = root;
for(int i = 0 ; i<prefix.length();i++){
if(p.children[prefix.charAt(i)-'a']==null){
return 0;
}
p = p.children[prefix.charAt(i)-'a'];
}
return dfsSum(p,p.val);
}
//深度搜索和
public int dfsSum(DistinctionTree root,int sum){
for(int i = 0 ; i < 26 ; i++){
if(root.children[i]!=null){
sum = dfsSum(root.children[i],sum+root.children[i].val);
}
}
return sum;
}
}