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: Null Input: sum("ap"), Output: 3 Input: insert("app", 2), Output: Null Input: sum("ap"), Output: 51、这个题的一个难点在于怎么判断是 添加 还是 覆盖。
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);
*/