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: 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);
*/
本文介绍了一种使用字典树(Trie)实现 MapSumPairs 的方法,该方法包含 insert 和 sum 两个核心操作。insert 方法用于插入键值对,如果键已存在则更新其值;sum 方法返回所有键以指定前缀开始的键值对的值之和。通过详细的代码解释了如何处理键的添加与覆盖,并展示了如何高效地完成 sum 操作。
429

被折叠的 条评论
为什么被折叠?



