剑指offer 专项突破版 66、单词之和

该博客讨论了一种使用前缀树(Trie)数据结构来存储字符串键和整数值,并能高效地计算以特定前缀开头的键所对应值的总和的方法。博主提出了在结点上存储值的思路,通过遍历前缀来求和,并通过HashMap来处理值的更新。此外,还提供了一个MapSum类的实现,包括插入操作和求和方法,以展示这一概念。
摘要由CSDN通过智能技术生成

题目链接

思路
  • 这道题关键在于求 以前缀prefix开头的键key的值的总和,可以用前缀树结点存放val来解决
  • 具体操作为:给前缀树的结点增设一个val属性,通过key建立前缀树时把每一个经过的结点加上value
  • 在求总和时只需要遍历prefix,然后返回最终结点的val即可~
  • 比如首先输入[“apple”, 3] 我们首先建立前缀树,然后把每个结点(a p p l e)的val都置为3,然后再输入[“app”, 2],我们再把前三个结点(a p p)的val+2,这样最终的结点和对应的值分别为(a:5 p:5 p:5 l:3 e:3)。如果输入前缀为ap,那么我们就遍历到第一个p,然后返回他的val 5
  • 这样有一个致命的缺陷在于,如果更新val,结点的和不会更新,只会增加。但是我们可以通过增加一个HashMap来改进建立前缀树的过程。在输入一个key时,我们首先查表,如果能找到它原先的val值,我们就在结点增加完val后再减去原先的val,这样就实现了更新目的~
class MapSum {

    class TrieNode {
        int value;
        TrieNode[] children;

        TrieNode() {
            value = 0;
            children = new TrieNode[26];
        }
    }

    private TrieNode root;
    Map<String, Integer> map;

    /**
     * Initialize your data structure here.
     */
    public MapSum() {
        root = new TrieNode();
        map = new HashMap<>();
    }

    public void insert(String key, int val) {
        
        int delta = val - map.getOrDefault(key, 0);
        map.put(key,val);

        TrieNode cur = root;
        for (char ch : key.toCharArray()) {
            if (null == cur.children[ch - 'a'])
                cur.children[ch - 'a'] = new TrieNode();
            cur = cur.children[ch - 'a'];
            cur.value += val - delValue;
        }
    }

    public int sum(String prefix) {
        TrieNode cur = root;
        for (char ch : prefix.toCharArray()) {
            if (null == cur.children[ch - 'a'])
                return 0;
            cur = cur.children[ch - 'a'];
        }
        return cur.value;
    }
}
补充一下作者的思路
  • 他选择在单词的末端保存val值,因此每次insert时值都会被覆盖~ 不再需要用哈希表保存原先的val
  • 然后在求sum时先遍历到prefix的末尾结点,然后遍历这个结点的所有子树,返回所有叶子结点的val和~
  • 还是觉得我的思路好 b( ̄▽ ̄)d
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值