Question Definition
Implement a MapSum class with insert, and sum methods.
For the method insert, you’ll be given a pair of (string, integer). The string represents the key and the integer represents the value. If the key already existed, then the original key-value pair will be overridden to the new one.
For the method sum, you’ll be given a string representing the prefix, and you need to return the sum of all the pairs’ value whose key starts with the prefix. Example 1:
Input: insert("apple", 3), Output: Null
Input: sum("ap"), Output: 3
Input: insert("app", 2), Output: Null
Input: sum("ap"), Output: 5
Java Solution
class MapSum {
TrieNode root;
Set<String> set;
/** Initialize your data structure here. */
public MapSum() {
root = new TrieNode(0);
set = new HashSet<>();
}
public void insert(String key, int val) {
TrieNode cur = root;
for(int i = 0; i < key.length(); i++) {
if(cur.children.containsKey(key.charAt(i))){
cur = cur.children.get(key.charAt(i));
if(set.contains(key))
cur.value = val;
else
cur.value += val;
}else{
TrieNode newNode = new TrieNode(val);
cur.children.put(key.charAt(i), newNode);
cur = newNode;
}
}
set.add(key);
}
public int sum(String prefix) {
TrieNode cur = root;
for(int i = 0; i < prefix.length(); i++) {
if(cur.children.containsKey(prefix.charAt(i)))
cur = cur.children.get(prefix.charAt(i));
else{
return 0;
}
}
return cur.value;
}
class TrieNode {
int value;
Map<Character, TrieNode> children;
public TrieNode(int value) {
this.value = value;
children = new HashMap<>();
}
}
}
/**
* Your MapSum object will be instantiated and called as such:
* MapSum obj = new MapSum();
* obj.insert(key,val);
* int param_2 = obj.sum(prefix);
*/
Comments