0677. Map Sum Pairs - kumaeki/LeetCode GitHub Wiki
Implement the MapSum
class:
MapSum()
Initializes the MapSum object.void insert(String key, int val)
Inserts thekey-val
pair into the map. If thekey
already existed, the originalkey-value
pair will be overridden to the new one.int sum(string prefix)
Returns the sum of all the pairs' value whosekey
starts with theprefix
.
Example 1:
Input
["MapSum", "insert", "sum", "insert", "sum"]
[], ["apple", 3], ["ap"], ["app", 2], ["ap"](/kumaeki/LeetCode/wiki/],-["apple",-3],-["ap"],-["app",-2],-["ap")
Output
[null, null, 3, null, 5]
Explanation
MapSum mapSum = new MapSum();
mapSum.insert("apple", 3);
mapSum.sum("ap"); // return 3 (apple = 3)
mapSum.insert("app", 2);
mapSum.sum("ap"); // return 5 (apple + app = 3 + 2 = 5)
Constraints:
- 1 <= key.length, prefix.length <= 50
- key and prefix consist of only lowercase English letters.
- 1 <= val <= 1000
- At most 50 calls will be made to insert and sum.
解法1
用HashMap来保存键值对, 用Tree来实时计算前缀的值.
class MapSum {
Map<String, Integer> map;
Node root;
/** Initialize your data structure here. */
public MapSum() {
root = new Node(0);
map = new HashMap<>();
}
public void insert(String key, int val) {
int value = val;
// 如果key已经存在, 那么更新tree的值时只更新差值
if(map.containsKey(key))
value = val - map.get(key);
// 更新HashMap的值
map.put(key, val);
// 更新Tree中,key所经过的所有节点的值
Node node = root;
for(char c : key.toCharArray()){
int index = c-'a';
if(node.next[index] == null)
node.next[index] = new Node(0);
node.next[index].val += value;
node = node.next[index];
}
}
public int sum(String prefix) {
Node node = root;
for(char c : prefix.toCharArray()){
int index = c - 'a';
if(node.next[index] == null)
return 0;
node = node.next[index];
}
return node.val;
}
}
class Node{
int val;
Node[] next;
public Node(int val){
this.val = val;
next = new Node[26];
}
}
/**
* Your MapSum object will be instantiated and called as such:
* MapSum obj = new MapSum();
* obj.insert(key,val);
* int param_2 = obj.sum(prefix);
*/