leetcode 677. Map Sum Pairs

来源:互联网 发布:如何免费申请邮箱域名 编辑:程序博客网 时间:2024/05/21 04:17

677. Map Sum Pairs

Implement a MapSum class with insert, and sum methods.

For the method insert, you'll be given a pair of (string, integer). The string represents the key and the integer represents the value. If the key already existed, then the original key-value pair will be overridden to the new one.

For the method sum, you'll be given a string representing the prefix, and you need to return the sum of all the pairs' value whose key starts with the prefix.

Example 1:

Input: insert("apple", 3), Output: NullInput: sum("ap"), Output: 3Input: insert("app", 2), Output: NullInput: sum("ap"), Output: 5
1、这个题的一个难点在于怎么判断是 添加 还是 覆盖。


class TrieNode{    public:        char var;        int value;     bool isword;    TrieNode* children[26];                TrieNode()           {                var = 0;                value = 0;        isword = 0;        memset(children, 0, sizeof(TreeNode*)*26);                    }            TrieNode(char c, int v)          {                var = c;                value = v;         isword = 0;        memset(children, 0, sizeof(TreeNode*)*26);            }        };  class MapSum {public:    /** Initialize your data structure here. */    MapSum()     {        root = new TrieNode();        }        void insert(string s, int val)     {        TrieNode* p = root;            //先要判断是覆盖还是添加,也就是判断是否存在这个string        int isexist = 0;        for (int k = 0; k < s.size(); k++)            {                if (p->children[s[k] - 'a'] != 0)                 p = p->children[s[k] - 'a'];            else                break;            if (k + 1 == s.size() && p->isword) //说明已经存在            {                 isexist = p->value; //那就是覆盖 需要先减去原来的值            }        }        //再改变每个节点的value,有公共前缀的,就把值都加上去。        p = root;        for (int k = 0; k < s.size(); k++)            {                if (p->children[s[k] - 'a'] == 0)                {                    TrieNode* pnew = new TrieNode(s[k], val);                    p->children[s[k] - 'a'] = pnew;                 p = p->children[s[k] - 'a'];             }              else            {                p = p->children[s[k] - 'a'];                p->value += val - isexist;  //如果是覆盖,减去原来的值            }                        if (k + 1 == s.size())                p->isword = true;        }            }        int sum(string s)     {        TrieNode* p = root;            for (int k = 0; k < s.size(); k++)            {                    if (p->children[s[k] - 'a'] != 0)                p = p->children[s[k] - 'a'];             else                return 0;        }          return p->value;          }private:    TrieNode* root;};/** * Your MapSum object will be instantiated and called as such: * MapSum obj = new MapSum(); * obj.insert(key,val); * int param_2 = obj.sum(prefix); */