题目:
题解:
本题采用前缀树来解题,前缀树节点设有三个成员变量,sumval
用来存储字符串前缀的val
(前缀就是除去尾字符之前的字符叫前缀)以及相同的key要更新前缀的val
,字符串尾字符的val就是记录字符串的val,next[26]表示每个节点值可以取到26个小写字母中的一个。这里我们用一个haspmap来记录遇到相同的key时,原来的val将被替代。
代码如下:
class MapSum {
public:
struct TrieTree{
int val,sumval;
TrieTree *next[26]{nullptr};//下一个节点值
TrieTree():val(0),sumval(0){};
};
private:
TrieTree *root;//前缀树根节点
unordered_map<string,int> record;
public:
/** Initialize your data structure here. */
MapSum() {
root=new TrieTree();
record.clear();
}
void insert(string key, int val) {
TrieTree* note=root;
int size=key.size();
for(int i=0;i<size;++i)
{
int pos=key[i]-'a';
if(note->next[pos]==nullptr)note->next[pos]=new TrieTree();//节点值不存在,就添加一个新节点
if(i!=size-1)(note->next[pos])->sumval+=val-record[key];//用sumval来记录字符串前缀的val值或相同key需要更新sumval记录的前缀值
note=note->next[pos];
}
record[key]=val;//更新关键字的val
note->val=val;//字符串的val
}
int sum(string prefix) {
TrieTree* note=root;
for(auto p:prefix)
{
if(note->next[p-'a']==nullptr)return 0;//字符p不是前缀树的某个前缀,直接返回0
note=note->next[p-'a'];
}
return note->val+note->sumval;//其他字符串的前缀和+该字符串的val
}
};