题干
实现一个 MapSum 类里的两个方法,insert 和 sum。
对于方法 insert,你将得到一对(字符串,整数)的键值对。字符串表示键,整数表示值。如果键已经存在,那么原来的键值对将被替代成新的键值对。
对于方法 sum,你将得到一个表示前缀的字符串,你需要返回所有以该前缀开头的键的值的总和。
示例 1:
输入: insert(“apple”, 3), 输出: Null
输入: sum(“ap”), 输出: 3
输入: insert(“app”, 2), 输出: Null
输入: sum(“ap”), 输出: 5
解法
1、创建Map存储整数值
这个思路是我对Trie理解不够深入的情况下想到的办法,我当时错误地以为每个字符一样的节点都是同一个节点,如果对他们使用value属性赋值地话,会导致比如ab,cb单词的值重合。但事实上每个节点都是独一无二的,它只与它上一个字符节点和下一个字符节点相连,和别的节点没有任何联系。以下是我在误导下想到的解题办法:
由题意可以很容易想到使用Trie来做,这个方法的思路在于保留节点的isWord属性,同时在Trie中增加一个map对象,当Trie新增单词时,在map中保存这个单词的值。然后在sum的函数里使用递归的方法,不断地查询有这个前缀的字符有没有isWord标记,有的话则相加,同时加上包含下一个节点以及新字符串(原先的前缀 加上 这个字符)的递归函数,最终可得sum值。
class MapSum {
private class Node{
public boolean isWord;
public TreeMap<Character, Node> next;
public Node(){
isWord = false;
next = new TreeMap<>();
}
}
private Node root;
private TreeMap<String, Integer> map;
/** Initialize your data structure here. */
public MapSum() {
root = new Node();
map = new TreeMap<>();
}
public void insert(String key, int val) {
map.put(key,val);
Node cur = root;
for