这是我的第一篇文章,这个系列(每日一题)会长期更新下去,题解所用语言以C++为主,可能还会写点JavaScript、Go、Rust。
有疑问请回复,知无不言。
题目链接:677. 键值映射 - 力扣(LeetCode) (leetcode-cn.com)
难度:Medium
建Trie树,每个节点存一个字符,在插入的单词的结尾更新value。查询时先找到词尾字符所在节点,递归求子树和。
class Trie {
private:
Trie *nex[26];
int val;
public:
Trie(){
val = 0;
memset(nex,0,sizeof(nex));
}
void insert(string key, int val){
Trie* tr = this;
for(char ch:key){
if(!tr->nex[ch-'a']){
tr->nex[ch-'a'] = new Trie();
}
tr = tr->nex[ch-'a'];
}
tr->val = val;
}
int sum(string prefix){
Trie* tr = this;
for(char ch:prefix){
// 不存在以此单词为前缀的路径,记为0
if(!tr->nex[ch-'a']){
return 0;
}
tr = tr->nex[ch-'a'];
}
return sub(tr);
}
int sub(Trie* tr){
int sum = tr->val;
for(int i=0;i<26;i++){
if(tr->nex[i]){
sum += sub(tr->nex[i]);
}
}
return sum;
}
};
class MapSum {
private:
Trie* tr;
public:
MapSum() {
tr = new Trie();
}
void insert(string key, int val) {
tr->insert(key,val);
}
int sum(string prefix) {
return tr->sum(prefix);
}
};
/**
* Your MapSum object will be instantiated and called as such:
* MapSum* obj = new MapSum();
* obj->insert(key,val);
* int param_2 = obj->sum(prefix);
*/