题目:
Implement a MapSum class with insert
, and sum
methods.
For the method insert
, you'll be given a pair of (string, integer). The string represents the key and the integer represents the value. If the key already existed, then the original key-value pair will be overridden to the new one.
For the method sum
, you'll be given a string representing the prefix, and you need to return the sum of all the pairs' value whose key starts with the prefix.
Example 1:
Input: insert("apple", 3), Output: Null Input: sum("ap"), Output: 3 Input: insert("app", 2), Output: Null Input: sum("ap"), Output: 5
思路:
这是一道标准的字典树的应用示例。我们建立一个字典树,并且将每一个字典树中的字符串都映射到其所对应的整数。insert的过程其实就是构建字典树的过程。而sum的过程其实也就是search的过程,搜索到所有以prefix为前缀的字符串,并且将它们对应的整数加起来即可。
代码:
class MapSum {
public:
/** Initialize your data structure here. */
MapSum() {
root = new TrieNode();
}
void insert(string key, int val) {
TrieNode *node = root;
for (int i = 0; i < key.length(); ++i) {
int index = key[i] - 'a';
if (node->children[index] == NULL) {
node->children[index] = new TrieNode();
}
node = node->children[index];
}
node->finished = true;
node->value = val;
}
int sum(string prefix) {
TrieNode *node = root;
for (int i = 0; i < prefix.length(); ++i) {
int index = prefix[i] - 'a';
if (node->children[index] == NULL) {
return 0;
}
node = node->children[index];
}
return DFS(node);
}
private:
struct TrieNode {
bool finished;
int value; // only valid when finished == true
vector<TrieNode*> children;
TrieNode() {
finished = false;
value = 0;
children = vector<TrieNode*>(26, NULL);
}
};
int DFS(TrieNode *node) {
if (node == NULL) {
return 0;
}
int ret = 0;
if (node->finished) {
ret += node->value;
}
for (int i = 0; i < 26; ++i) {
ret += DFS(node->children[i]);
}
return ret;
}
TrieNode *root;
};
/**
* Your MapSum object will be instantiated and called as such:
* MapSum obj = new MapSum();
* obj.insert(key,val);
* int param_2 = obj.sum(prefix);
*/