int sum(string prefix) 返回所有以该前缀 prefix 开头的键 key 的值的总和。
核心思路:
该题仍然是前缀树应用题。
insert 函数相当于往前缀树中插入单词,在单词的结尾更新 val。
sum 函数相当于在前缀树中搜索前缀 prefix,如果没有路径可以走完 prefix,则说明前缀树中没有单词具有前缀 prefix,此时返回 0 即可;如果走完 prefix,则继续递归访问,获得当前节点所在子树的所有节点值。
代码实现:
classTrie{public:
vector<Trie*> next;int val;Trie():next(26,nullptr),val(0){}};classMapSum{private:
Trie* root;intdfs(Trie* cur){if(!cur)return0;int ans = cur->val;for(int i =0; i <26;++i)
ans +=dfs(cur->next[i]);return ans;}public:/** Initialize your data structure here. */MapSum(){
root =newTrie();}voidinsert(string key,int val){
Trie* cur = root;for(char& c : key){if(!cur->next[c-'a']) cur->next[c-'a']=newTrie();
cur = cur->next[c-'a'];}
cur->val = val;}intsum(string prefix){
Trie* cur = root;for(char& c : prefix){if(!cur->next[c-'a'])return0;
cur = cur->next[c-'a'];}returndfs(cur);}};