糖逗 发表于 2020-6-8 10:50:17

C++刷leetcode(677. 键值映射)【字典树】

题目描述:
实现一个 MapSum 类里的两个方法,insert 和 sum。

对于方法 insert,你将得到一对(字符串,整数)的键值对。字符串表示键,整数表示值。如果键已经存在,那么原来的键值对将被替代成新的键值对。

对于方法 sum,你将得到一个表示前缀的字符串,你需要返回所有以该前缀开头的键的值的总和。

示例 1:

输入: insert("apple", 3), 输出: Null
输入: sum("ap"), 输出: 3
输入: insert("app", 2), 输出: Null
输入: sum("ap"), 输出: 5

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/map-sum-pairs
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


class MapSum {
private:
    bool isEnd;
    MapSum* next;
    vector<int> value;
    set<string> store;
public:
    /** Initialize your data structure here. */
    MapSum() {
      isEnd = false;
      memset(next, 0, sizeof(next));
      value = {};
    }
   
    void insert(string key, int val) {
      MapSum* node = this;
      auto cha = store.insert(key);
      bool flag = cha.second;
      for(auto cha : key){
            if(node -> next == NULL){
                node -> next = new MapSum();
            }
            node = node -> next;
            if(flag == false)node -> value.pop_back();
            node ->value.push_back(val);
      }
      node -> isEnd = true;
    }
   
    int sum(string prefix) {
      MapSum*node = this;
      int res = 0;
      for(auto cha : prefix){
            if(node -> next == NULL) return res;
            node = node -> next;
      }
      int len = node -> value.size();
      for(int i = 0; i < len; i++){
            res += node -> value;
      }
      return res;
    }
};

/**
* Your MapSum object will be instantiated and called as such:
* MapSum* obj = new MapSum();
* obj->insert(key,val);
* int param_2 = obj->sum(prefix);
*/
页: [1]
查看完整版本: C++刷leetcode(677. 键值映射)【字典树】