美文网首页
677. 键值映射(Python)

677. 键值映射(Python)

作者: 玖月晴 | 来源:发表于2020-11-30 10:35 被阅读0次

题目

难度:★★★☆☆
类型:字符串
方法:前缀树

力扣链接请移步本题传送门
更多力扣中等题的解决方案请移步力扣中等题目录

实现一个 MapSum 类,支持两个方法,insert 和 sum:

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

示例:

输入:
["MapSum", "insert", "sum", "insert", "sum"]
[[], ["apple", 3], ["ap"], ["app", 2], ["ap"]]
输出:
[null, null, 3, null, 5]

解释:
MapSum mapSum = new MapSum();
mapSum.insert("apple", 3);
mapSum.sum("ap"); // return 3 (apple = 3)
mapSum.insert("app", 2);
mapSum.sum("ap"); // return 5 (apple + app = 3 + 2 = 5)

提示:

1 <= key.length, prefix.length <= 50
key 和 prefix 仅由小写英文字母组成
1 <= val <= 1000
最多调用 50 次 insert 和 sum

解答

方法1:直接计算

用直来直去的逻辑,加上python方便快捷的风格,可以快速实现:

class MapSum:

    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.dct = dict()

    def insert(self, key: str, val: int) -> None:
        self.dct.update({key: val})

    def sum(self, prefix: str) -> int:
        return sum([v for k, v in self.dct.items() if k.startswith(prefix)])

方法2:前缀树

要是只会用上面的方法可能失去了这道题的意义,这里推荐一种更快捷的前缀树方法。将所有单词根据共同前缀构建一前缀树,每个叶子节点上都有一个特定数值的果实,拥有相同前缀的集合实际上挂在一棵树杈上,用深度优先搜索的方法将这棵子树上所有的果实采摘即可。

这里详细写出了构建这棵树以及用深度优先搜索进行采摘的流程。

class MapSum:

    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.dct = dict()

    def insert(self, key: str, val: int) -> None:
        tmp = self.dct
        for c in key:
            if c not in tmp:
                tmp[c] = dict()
            tmp = tmp[c]
        tmp.update({'val': val})

    def sum(self, prefix: str) -> int:
        tmp = self.dct
        for c in prefix:
            if c in tmp:
                tmp = tmp[c]
            else:
                return 0

        def get_sum_of_subtree(node):
            for k, v in node.items():
                if k == 'val':
                    nonlocal s
                    s = s + v
                else:
                    get_sum_of_subtree(v)

        s = 0
        get_sum_of_subtree(tmp)
        return s

如有疑问或建议,欢迎评论区留言~

有关更多力扣中等题的python解决方案,请移步力扣中等题解析

相关文章

  • 677. 键值映射(Python)

    题目 难度:★★★☆☆类型:字符串方法:前缀树 力扣链接请移步本题传送门[https://leetcode-cn....

  • 677. 键值映射

    实现一个 MapSum 类里的两个方法,insert 和 sum。对于方法 insert,你将得到一对(字符串,整...

  • LeetCode 677. 键值映射

    677. 键值映射 实现一个 MapSum 类里的两个方法,insert 和 sum。 对于方法 insert,你...

  • 键值映射

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/map-su...

  • 2021-04-26pta终结刷题

    c++的map映射可以提前规定好映射的格式,然后可以根据键值直接添加python的dict使用{}初始化,不能直接...

  • Python中字典的操作

    字典是python中的唯一的映射类型,采用键值对(key-value)的形式存储数据。python对key进行哈希...

  • 编程小白不知道如何操作Python字典?建议看下本文

    今天小编要跟大家分享的文章是小白如何操作Python字典?Python 中的字典是Python中一个键值映射的数据...

  • Python 操作字典 的几个技巧

    Python 中的字典是Python中一个键值映射的数据结构,下面介绍一下如何优雅的操作字典. 1 创建字典 Py...

  • Fluent Python笔记--字典与集合

    所谓Python中字典的概念,简单理解就是一个键值对映射的数据模型。在collections库中有abc.Mapp...

  • python基础(三)----字典

    字典是Python的映射结构,是一种可变类型容器,且可存储任意类型对象。 一.字典的形式: 字典的每个键值(key...

网友评论

      本文标题:677. 键值映射(Python)

      本文链接:https://www.haomeiwen.com/subject/drkrwktx.html