1.前缀树
使用前缀树
代码如下:
class TrieNode
{
public:
int isWord;//表示键值
TrieNode *child[26];
TrieNode()
{
isWord=-1;
memset(child,0,sizeof(child));
}
~TrieNode()
{
for(int i=0;i<26;i++)
if(child[i])
delete child[i];
}
};
class MapSum {
public:
TrieNode *root;
/** Initialize your data structure here. */
MapSum() {
root=new TrieNode();
}
void insert(string key, int val) {
TrieNode *p=root;
for(int i=0;i<key.size();i++)
{
char ch=key[i];
if(p->child[ch-'a']==NULL)
p->child[ch-'a']=new TrieNode();
p=p->child[ch-'a'];
}
p->isWord=val;
}
int sum(string prefix) {
TrieNode *p=root;
int sum=0;
//遍历前缀
for(int i=0;i<prefix.size();i++)
{
char ch=prefix[i];
if(p->child[ch-'a']!=NULL)
p=p->child[ch-'a'];
else
return 0;
}
//此时,p指向前缀的最后一个字符
//继续搜索后面可能存在的字符串
return sumValue(p);
}
int sumValue(TrieNode *root)
{
if(root==NULL)
return 0;
int sum=0;
if(root->isWord!=-1)
sum+=root->isWord;//
for(int i=0;i<26;i++)
if(root->child[i]!=NULL)
sum+=sumValue(root->child[i]);
return sum;
}
};
/**
* Your MapSum object will be instantiated and called as such:
* MapSum* obj = new MapSum();
* obj->insert(key,val);
* int param_2 = obj->sum(prefix);
*/