|
@@ -0,0 +1,59 @@
|
|
|
+type trie struct {
|
|
|
+ freq int
|
|
|
+ word bool
|
|
|
+ next [26]*trie // '26' is quite important!
|
|
|
+}
|
|
|
+
|
|
|
+func (t *trie) insert(key string, val int) {
|
|
|
+ res := t.search(key)
|
|
|
+ if res != nil && res.word {
|
|
|
+ val -= res.freq
|
|
|
+ }
|
|
|
+ for _, r := range key {
|
|
|
+ i := r - 'a'
|
|
|
+ if t.next[i] == nil {
|
|
|
+ t.next[i] = &trie{}
|
|
|
+ }
|
|
|
+ t = t.next[i]
|
|
|
+ t.freq += val
|
|
|
+ }
|
|
|
+ t.word = true
|
|
|
+}
|
|
|
+
|
|
|
+func (t *trie) search(key string) *trie {
|
|
|
+ for _, r := range key {
|
|
|
+ t = t.next[r-'a']
|
|
|
+ if t == nil {
|
|
|
+ break
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return t
|
|
|
+}
|
|
|
+
|
|
|
+type MapSum struct {
|
|
|
+ tree trie
|
|
|
+}
|
|
|
+
|
|
|
+/** Initialize your data structure here. */
|
|
|
+func Constructor() MapSum {
|
|
|
+ return MapSum{}
|
|
|
+}
|
|
|
+
|
|
|
+func (this *MapSum) Insert(key string, val int) {
|
|
|
+ this.tree.insert(key, val)
|
|
|
+}
|
|
|
+
|
|
|
+func (this *MapSum) Sum(prefix string) int {
|
|
|
+ res := this.tree.search(prefix)
|
|
|
+ if res == nil {
|
|
|
+ return 0
|
|
|
+ }
|
|
|
+ return res.freq
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * Your MapSum object will be instantiated and called as such:
|
|
|
+ * obj := Constructor();
|
|
|
+ * obj.Insert(key,val);
|
|
|
+ * param_2 := obj.Sum(prefix);
|
|
|
+ */
|