实现一个 MapSum 类,支持两个方法,insert 和 sum:
- MapSum() 初始化 MapSum 对象
- void insert(String key, int val) 插入 key-val 键值对,字符串表示键 key ,整数表示值 val 。如果键 key 已经存在,那么原来的键值对将被替代成新的键值对。
- int sum(string prefix) 返回所有以该前缀 prefix 开头的键 key 的值的总和。
解法
通过字典树存储各种前缀的val值,在调用函数sum时直接在字典树中搜索对应的val即可获取到以prefix开头的键key的值的总和。
class MapSum {
class TrieNode{
int val;
TrieNode[] next=new TrieNode[26];
}
TrieNode root;
Map<String,Integer> map;
public MapSum() {
root=new TrieNode();
map=new HashMap();
}
public void insert(String key, int val) {
int delta=val-map.getOrDefault(key,0);
TrieNode node=root;
for(char c:key.toCharArray()){
if(node.next[c-'a']==null){
node.next[c-'a']=new TrieNode();
}
node=node.next[c-'a'];
node.val+=delta;
}
map.put(key,val);
}
public int sum(String prefix) {
TrieNode node=root;
for(char c:prefix.toCharArray()){
if(node.next[c-'a']==null)
return 0;
node=node.next[c-'a'];
}
return node.val;
}
}
/**
* Your MapSum object will be instantiated and called as such:
* MapSum obj = new MapSum();
* obj.insert(key,val);
* int param_2 = obj.sum(prefix);
*/