题目:
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
实现:
- 蛮力解法:已字符串为key和计数为value创建HashMap,进行sum 时遍历HashMap,如果该键以给定的前缀开头,则进行累计。 时间复杂度 O(N), 空间复杂度O(N)
class MapSum {
private HashMap<String, Integer> map;
/** Initialize your data structure here. */
public MapSum() {
map = new HashMap<>();
}
public void insert(String key, int val) {
map.put(key, val);
}
public int sum(String prefix) {
int ans = 0;
for (String key: map.keySet()){
if (key.startsWith(prefix)){
ans += map.get(key);
}
}
return ans;
}
}
- 前缀hash:单独创建一个SumMap存放前缀所有出现的累计值,当插入键值对时Map,SumMap记录所有前缀子串的值val, 如果插入键值对已存在。 SumMap记录其变化值 val – map.getOrDefault(key, 0)。 时间复杂度 O(N), 空间复杂度O(N)
class MapSum {
private Map <String, Integer> map;
private Map <String, Integer> summap;
public MapSum() {
map = new HashMap<>();
summap = new HashMap<>();
}
public void insert(String key, int val) {
int delta = val - map.getOrDefault(key, 0);
map.put(key, val);
String prefix = "";
for (char c: key.toCharArray()){
prefix += c;
summap.put(prefix, summap.getOrDefault(prefix, 0)+delta);
}
}
public int sum(String prefix) {
return summap.getOrDefault(prefix, 0);
}
}
-
Trie: Tire节点中增加一个计数器即可, 流程与上一个解法一致。
class TrieNode {
Map<Character, TrieNode> children = new HashMap();
Integer score = new Integer(0);
}
class MapSum {
private TrieNode root;
private 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);
map.put(key, val);
TrieNode cur = root;
cur.score += delta;
for (char c: key.toCharArray()){
cur.children.putIfAbsent(c, new TrieNode());
cur = cur.children.get(c);
cur.score += delta;
}
}
public int sum(String prefix) {
TrieNode cur = root;
for (char c: prefix.toCharArray()){
cur = cur.children.get(c);
if (cur == null ){
return 0;
}
}
return cur.score;
}
}
参考及引用:
https://leetcode.com/problems/map-sum-pairs/solution/
Photo by Steve Johnson from Pexels
Comments are closed.