题目
类型:design
解题思路
字典树
由于要处理前缀,自然而然联想到可以用 Trie(前缀树)来处理此问题。
在前缀对应的 Trie 的每个节点存储该前缀对应的值。
- insert 操作:首先求出前缀对应的值的改变 delta,直接在 Trie 节点上更新键 key 的每个前缀对应的值。
- sum 操作:直接在前缀树上搜索该给定的前缀对应的值即可,如果给定的前缀不在前缀树中,则返回 0。
当然在实际中也可以在 Trie 的节点只存储键 key 对应的 val, 每次求 sum 时利用 DFS 或者 BFS 遍历前缀树的子树即可。
代码
class MapSum {class TrieNode {int val = 0;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);map.put(key, val);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;}}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;}}
