键值映射
- 题目
- 函数原型
- 字典树实现映射
题目
题目: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); }
};