键值映射

  • 题目
  • 函数原型
  • 字典树实现映射



 


题目

题目:https://leetcode-cn.com/problems/Map-sum-pairs/

 


函数原型

class MapSum {
public:
    MapSum() {}
    void insert(string key, int val) {}
    int sum(string prefix) {}
};

 


字典树实现映射

映射的格式:[677]. 键值映射(字典树实现映射)_字典树

重新定义字典树结构:

class Trie{
    vector<Trie*> next;                                // 指针数组,数组中存放的是指针,默认为 nullptr
    int value;                                         // 值,也可代替 isEnd,为 0 是 false

完整代码:

class Trie {
    vector<Trie*> next;                                // 指针数组,数组中存放的是指针,默认为 nullptr
    int value;                                         // 值,也可代替 isEnd,为 0 是 false
    
public:
    Trie() : next(26, nullptr), value(0) {}

	/* 向 Trie 中添加一个新的单词:单词的每一个字符都添加后,更新 val */
    void insert(string s, int val) {
        Trie *root = this;                             // 声明一个变量,初始的时候在 root 位置
        for(auto &c : s) {                             // 每次取出一个字符
            int x = c - 'a';                           // 一个单词可能另一个单词的前缀,避免重复创建
            if(root->next[x] == nullptr)               // 检查节点的孩子节点是否存在字母 c 这个结点
                root->next[x] = new Trie();            // 不重复,才创建
            root = root->next[x];                      // 如果已经存在,就直接走到孩子结点
        }
        root->value = val;                             // 直到 root 来到最后一个字符,表示添加完毕,更新 val
    }

    /* 将所有节点的 value 值相加
	   - 先查询,遍历 root 以及 root 所有子树
	   - 再相加
    */
    int sum(string prefix) {                 // 查询部分             
        Trie* root = this;
        for (char c : prefix) {
            c -= 'a';
            if (root->next[c] == nullptr)
                return 0;              
            root = root->next[c];
        }

        int res = 0;                         // 根节点的 value
        __sum(root, res);                    // 最后做一次累加
        return res;
    }

	// 将所有节点的 value 值相加
	void __sum(Trie *root, int& res) {
        res += root->value;                  // 根节点的 value
		for( int i=0; i<26; i++ )            // 查看 root 节点是否有孩子节点
            if( root->next[i] )
			    __sum( root->next[i], res ); // 有就加入
		return;
	}
};

class MapSum {
	Trie *trie;  

public:
    MapSum() { trie = new Trie(); }
    void insert(string key, int val) { trie->insert(key, val); }
    int sum(string prefix) { return trie->sum(prefix); }
};