[前缀树]leetcode667:键值映射(medium)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_43152052/article/details/100590014

题目:
在这里插入图片描述
题解:
本题采用前缀树来解题,前缀树节点设有三个成员变量,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
    }
};

猜你喜欢

转载自blog.csdn.net/qq_43152052/article/details/100590014