[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]. 键值映射的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 677 键值映射[Map] HERODING的LeetCode之路