leetcode键值映射

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);
 */
发布了191 篇原创文章 · 获赞 3 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_38196982/article/details/104879466