LeetCode每日一题:677. 键值映射【2021/11/14】

572 阅读1分钟

这是我的第一篇文章,这个系列(每日一题)会长期更新下去,题解所用语言以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);
 */