题目描述
样例描述
示例 1:
输入:
["MapSum", "insert", "sum", "insert", "sum"]
[[], ["apple", 3], ["ap"], ["app", 2], ["ap"]]
输出:
[null, null, 3, null, 5]
解释:
MapSum mapSum = new MapSum();
mapSum.insert("apple", 3);
mapSum.sum("ap"); // 返回 3 (apple = 3)
mapSum.insert("app", 2);
mapSum.sum("ap"); // 返回 5 (apple + app = 3 + 2 = 5)
思路
字典树 + DFS
- 将key挂在字典树上,然后在最后一个字母的下一个字母上存储val。因为遍历完prefix后,也会停留到最后一个字母的下一个。 而且如果是最后一个的 ,dfs求和时会多算上prefix最后一个字母的val
- 对于前缀如果找不到,直接返回0不存在。否则就dfs遍历以当前前缀最后一个字母的所有孩子结点,只要不为空就往下遍历。然后累加val,不存在的话val为0
- 求和部分要递归求和,因为p的孩子结点可能还有孩子
代码
class MapSum {
class TrieNode {
int val = 0;
TrieNode tns[];
public TrieNode() {
tns = new TrieNode[26];
}
}
private TrieNode root;
public MapSum() {
root = new TrieNode();
}
public void insert(String key, int val) {
TrieNode p = root;
for (int i = 0; i < key.length(); i ++ ) {
char c = key.charAt(i);
int u = c - 'a';
if (p.tns[u] == null) {
p.tns[u] = new TrieNode();
}
if (i == key.length() - 1) {
p.tns[u].val = val;
}
p = p.tns[u];
}
}
public int sum(String prefix) {
TrieNode p = root;
for (char c: prefix.toCharArray()) {
int u = c - 'a';
if (p.tns[u] == null) {
return 0;
}
p = p.tns[u];
}
return dfs(p);
}
public int dfs(TrieNode root) {
int ans = root.val;
for (TrieNode p: root.tns) {
if (p != null) {
ans += dfs(p);
}
}
return ans;
}
}
|