0设计数据结构中等 LeetCode677. 键值映射

677. 键值映射

描述

实现一个 MapSum 类,支持两个方法,insert 和 sum:
MapSum() 初始化 MapSum 对象
void insert(String key, int val) 插入 key-val 键值对,字符串表示键 key ,整数表示值 val 。如果键 key 已经存在,那么原来的键值对将被替代成新的键值对。
int sum(string prefix) 返回所有以该前缀 prefix 开头的键 key 的值的总和。

分析

这是一道前缀树应用题,和LRU一样是“设计数据结构”类型的题目。
不了解前缀树的如何实现可以看"宫水三叶"的【设计数据结构】实现 Trie (前缀树)
在基本的前缀树上面把boolean值变成val,想要求以该前缀 prefix 开头的键 key 的值的总和,可以使用深度遍历多叉树来求得。

看不懂还可以参考:【AmmoMercy】图解字典树+DFS+一个小彩蛋~

class MapSum {
    
    
    Trie root;
    public MapSum() {
    
    
        root = new Trie();
        // 开始写成了Trie root = new Trie(),后面的node.next[key.charAt(i)-'a']报错了,因为这样写没有给MapSum的root初始化。
    }
    
    public void insert(String key, int val) {
    
    
        Trie node = root;
        for(int i = 0; i < key.length(); i++){
    
    
            if(node.next[key.charAt(i)-'a'] == null){
    
    
                node.next[key.charAt(i)-'a'] = new Trie();
            }
            node = node.next[key.charAt(i)-'a'];
            if(i == key.length()-1){
    
    
                node.val = val;
            }
        }
    }
    
    public int sum(String prefix) {
    
    
        Trie node = root;
        for(int i = 0; i < prefix.length(); i++){
    
    
            if(node.next[prefix.charAt(i)-'a'] == null){
    
    
                return 0;
            }
            node = node.next[prefix.charAt(i)-'a'];
        }
        return search(node);
    }

    public int search(Trie node){
    
    
        if(node == null){
    
    
            return 0;
        }
        int sum = 0;
        for(int i = 0; i < 26; i++){
    
    
            sum += search(node.next[i]);
        }
        return sum + node.val;
    }
}

class Trie{
    
    
    int val;
    Trie[] next = new Trie[26];
    public Trie(){
    
    
        this.next = new Trie[26];
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43260719/article/details/121318601
今日推荐