trie:
维护当前节点的值,当前节点对应前缀的值
public class MapSum {
/**
* Initialize your data structure here.
*/
Trie trie;
public MapSum() {
trie = new Trie();
}
public void insert(String key, int val) {
insert(trie, key, val);
}
public int sum(String prefix) {
return findPrefixSum(trie, prefix);
}
private void insert(Trie root, String word, int value) {
for (char c : word.toCharArray()) {
if (root.children[c - 'a'] == null) root.children[c - 'a'] = new Trie(c, root);
root = root.children[c - 'a'];
}
//这个单词已经存在了
int diff;
if (root.isEnd ==true) {
diff = value - root.valueSingle;
} else {
diff = value;
root.isEnd = true;
}
root.valueSingle = value;
root.value += diff;
while(root.parent != null) {
root.parent.value += diff;
root = root.parent;
}
}
private int findPrefixSum(Trie root, String word) {
for (char c : word.toCharArray()) {
Trie trie = root.children[c - 'a'];
if (trie == null) return 0;
root = trie;
}
return root.value;
}
class Trie {
char val;
Trie[] children;
Trie parent;
boolean isEnd;
//前缀和
int value;
//自己节点对应单词的值
int valueSingle;
public Trie() {
children = new Trie[26];
this.isEnd = false;
value = 0;
valueSingle = 0;
parent = null;
}
public Trie(char val, Trie parent) {
this.val = val;
children = new Trie[26];
this.isEnd = false;
this.value = 0;
this.valueSingle = 0;
this.parent = parent;
}
}
}