题目
题解思路
字典树板子都不太熟悉
复习一下
这种数据结果,有点链表的感觉,带着一个指针指向后继的节点。
直接用字典树板子,计算总和的时候,在这个节点的后面节点全dfs一遍即可。
还可以遍历<unordered_map>来求解答案。这个操作我第一次看到,记录一下。
AC代码
字典树做法
class MapSum {
public:
int son[5101][50] ;
int cnt[5101] ;
int index = 0 ;
MapSum() {
memset(son,0,sizeof(son));
memset(cnt,0,sizeof(cnt));
}
void insert(string key, int val) {
int p = 0 ;
int sz = key.size();
for (int i = 0 ; i < sz ; i++ )
{
int u = key[i] - 'a' ;
if (!son[p][u])
{
index++;
son[p][u] = index ;
}
p = son[p][u] ;
}
cnt[p] = val ;
}
int sum(string prefix) {
int p = 0 ;
int sz = prefix.size() ;
for (int i = 0 ; i < sz ; i++ )
{
int u = prefix[i] - 'a' ;
if (!son[p][u])
return 0;
p = son[p][u];
//cout << p << "\n" ;
}
return dfs(p);
}
int dfs(int p )
{
int ans = cnt[p] ;
for (int i = 0 ; i < 26 ; i++ )
{
if (son[p][i])
{
ans += dfs(son[p][i]);
}
}
return ans ;
}
};
哈希表做法
class MapSum {
public:
unordered_map<string, int> mp;
MapSum() {
}
void insert(string key, int val) {
mp[key] = val;
}
int sum(string prefix) {
int ans = 0;
for (auto & [key, val] : mp) {
if (key.substr(0, prefix.size()) == prefix)
ans += val;
}
return ans;
}
};