描述
实现一个 MapSum 类,支持两个方法,insert 和 sum:
MapSum() 初始化 MapSum 对象
void insert(String key, int val) 插入 key-val 键值对,字符串表示键 key ,整数表示值 val 。如果键 key 已经存在,那么原来的键值对将被替代成新的键值对。
int sum(string prefix) 返回所有以该前缀 prefix 开头的键 key 的值的总和。
分析
这是一道前缀树应用题,和LRU一样是“设计数据结构”类型的题目。
不了解前缀树的如何实现可以看"宫水三叶"的【设计数据结构】实现 Trie (前缀树)
在基本的前缀树上面把boolean值变成val,想要求以该前缀 prefix 开头的键 key 的值的总和,可以使用深度遍历多叉树来求得。
看不懂还可以参考:【AmmoMercy】图解字典树+DFS+一个小彩蛋~
class MapSum {
Trie root;
public MapSum() {
root = new Trie();
// 开始写成了Trie root = new Trie(),后面的node.next[key.charAt(i)-'a']报错了,因为这样写没有给MapSum的root初始化。
}
public void insert(String key, int val) {
Trie node = root;
for(int i = 0; i < key.length(); i++){
if(node.next[key.charAt(i)-'a'] == null){
node.next[key.charAt(i)-'a'] = new Trie();
}
node = node.next[key.charAt(i)-'a'];
if(i == key.length()-1){
node.val = val;
}
}
}
public int sum(String prefix) {
Trie node = root;
for(int i = 0; i < prefix.length(); i++){
if(node.next[prefix.charAt(i)-'a'] == null){
return 0;
}
node = node.next[prefix.charAt(i)-'a'];
}
return search(node);
}
public int search(Trie node){
if(node == null){
return 0;
}
int sum = 0;
for(int i = 0; i < 26; i++){
sum += search(node.next[i]);
}
return sum + node.val;
}
}
class Trie{
int val;
Trie[] next = new Trie[26];
public Trie(){
this.next = new Trie[26];
}
}