哈希表+字典树
class MapSum {
public:
/** Initialize your data structure here. */
int ch[310][26];
int idx;
int v[70000];
unordered_map<string,int> g;
MapSum(){
memset(ch,0,sizeof ch);
memset(v,0,sizeof v);
g.clear();
}
void insert(string key, int val){
int p=0;
for(int i=0;i<key.size();i++){
int j=key[i]-'a';
if(!ch[p][j]) ch[p][j]=++idx;
p=ch[p][j];
v[p]+=val-g[key];
}
g[key]=val;
}
int sum(string prefix) {
int p=0;
for(int i=0;i<prefix.size();i++){
int j=prefix[i]-'a';
if(!ch[p][j]) return 0;
p=ch[p][j];
}
return v[p];
}
};
/**
* Your MapSum object will be instantiated and called as such:
* MapSum* obj = new MapSum();
* obj->insert(key,val);
* int param_2 = obj->sum(prefix);
*/
时间复杂度:
insert操作:O(n),n为key的长度。
sum操作:O(n),n为prefix的长度。
空间复杂度:O(nm),n为单词数量,m为最大单词长度。