1. 题目
来源:LeetCode键值映射
实现一个 MapSum 类里的两个方法,insert 和 sum。
对于方法 insert,你将得到一对(字符串,整数)的键值对。字符串表示键,整数表示值。如果键已经存在,那么原来的键值对将被替代成新的键值对。
对于方法 sum,你将得到一个表示前缀的字符串,你需要返回所有以该前缀开头的键的值的总和。
2. 示例
输入: insert("apple", 3), 输出: Null
输入: sum("ap"), 输出: 3
输入: insert("app", 2), 输出: Null
输入: sum("ap"), 输出: 5
3. 源码
import java.util.TreeMap;
class MapSum {
private class Node {
public int value;
// 一个字符下可能有多种next字符.
public TreeMap<Character, Node> next;
public Node(int value) {
this.value = value;
next = new TreeMap<>();
}
public Node() {
this(0);
}
}
private Node root;
/**
* Initialize your data structure here.
*/
public MapSum() {
root = new Node();
}
public void insert(String word, int value) {
Node cur = root;
for (int i = 0; i < word.length(); i++) {
char character = word.charAt(i);
// 判断下一个节点是否等于当前字符
if (cur.next.get(character) == null) {
cur.next.put(character, new Node());
}
// 获取这个字符对应的next node.
// 顺着word依次前进.
cur = cur.next.get(character);
}
cur.value = value;
}
public int sum(String prefix) {
Node cur = root;
// 得到前缀所在的最后一个节点.
for (int i = 0; i < prefix.length(); i++) {
char character = prefix.charAt(i);
if (cur.next.get(character) == null) {
return 0;
}
cur = cur.next.get(character);
}
return sum(cur);
}
private int sum(Node node) {
int result = node.value;
// 遍历得到前缀之后, 所有单词的value.
for (Character character : node.next.keySet()) {
result += sum(node.next.get(character));
}
return result;
}
}
/**
* Your MapSum object will be instantiated and called as such:
* MapSum obj = new MapSum();
* obj.insert(key,val);
* int param_2 = obj.sum(prefix);
*/