https://leetcode-cn.com/problems/map-sum-pairs/submissions/
1.双哈希表暴力,效果比较差
class MapSum {
unordered_map<string,int> mp1;//第一个哈希表用来存key和val
unordered_map<string,vector<string>> mp2;//第二个哈希表用来存储key和它的所有前缀
public:
/** Initialize your data structure here. */
MapSum() {
}
void insert(string key, int val) {
if(mp1[key]==0){
string res;
for(auto &ch:key)
{
res+=ch;
mp2[key].emplace_back(res);//将前缀放入vector中
}
}
mp1[key] =val;//更新val值
}
int sum(string prefix) {
int ret=0;
unordered_map<string,vector<string>>::iterator iter;
for(iter=mp2.begin();iter!=mp2.end();iter++)
{
auto v1 = iter->second;
for(int i=0;i<v1.size();i++)
{
if(prefix==v1[i]){//有满足条件的前缀就把它加到ret中,然后退出此轮循环,去寻找下一个字符串
ret+=mp1[iter->first];
break;
}
}
}
return ret;
}
};
2.单哈希表,简洁舒适
class MapSum {
unordered_map<string,int> mp1;//哈希表
public:
/** Initialize your data structure here. */
MapSum() {
}
void insert(string key, int val) {
mp1[key] =val;//更新value值
}
int sum(string prefix) {
int ret=0;//要返回的值
for(auto iter=mp1.begin();iter!=mp1.end();iter++)
{
if((iter->first).find(prefix)==0) ret+=iter->second;//哈希表中的项的key中如果可以找到前缀prefix,就让ret加上它的value值
}
return ret;
}
};
//str1.find(str2);//从串str1中查找时str2,返回str2中首个字符在str1中的地址,找前缀返回的首地址就是0