[677]. 键值映射

Posted Debroon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[677]. 键值映射相关的知识,希望对你有一定的参考价值。

 


题目

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

 


函数原型

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

 


字典树实现映射

映射的格式: 键 : 值 键:值

重新定义字典树结构:

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); 
;

以上是关于[677]. 键值映射的主要内容,如果未能解决你的问题,请参考以下文章

[677]. 键值映射

leetcode设计类题目——677. 键值映射

LeetCode 677 键值映射[Map] HERODING的LeetCode之路

快乐水题677. 键值映射

LeetCode677. 键值映射(相关话题:Trie前缀树)

LeetCode677. 键值映射(相关话题:Trie前缀树)