( “树” 之 Trie) 677. 键值映射 ——【Leetcode每日一题】

news2024/12/24 9:34:51

知识点回顾Trie,又称前缀树字典树,用于判断字符串是否存在或者是否具有某种字符串前缀。
在这里插入图片描述

❓677. 键值映射

难度:中等

设计一个 map ,满足以下几点:

  • 字符串表示键,整数表示值
  • 返回具有前缀等于给定字符串的键的值的总和

实现一个 MapSum 类:

  • MapSum() 初始化 MapSum 对象
  • void insert(String key, int val) 插入 key-val 键值对,字符串表示键 key ,整数表示值 val 。如果键 key 已经存在,那么原来的键值对 key-value 将被替代成新的键值对。
  • 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”); // 返回 3 (apple = 3)
mapSum.insert(“app”, 2);
mapSum.sum(“ap”); // 返回 5 (apple + app = 3 + 2 = 5)

提示:

  • 1 <= key.length, prefix.length <= 50
  • keyprefix 仅由小写英文字母组成
  • 1 <= val <= 1000
  • 最多调用 50insertsum

💡思路:

我们要定义一个名为TrieNode的类,它有两个属性:

  • val:表示所有到达该节点的前缀 prefix 开头的键 key 的值的总和;
  • children:这是一个大小为26的数组,表示当前节点的子节点。数组的每个元素代表一个字母(从az)。如果当前节点有一个子节点(例如a),则children数组的相应位置(即索引0)将包含一个TrieNode对象。
  • insert 操作:我们首先求出前缀对应的值的改变 num,我们直接在 TrieNode 节点上更新键 key 的每个前缀对应的值。
  • sum 操作: 我们直接在前缀树上搜索该给定的前缀对应的值即可,如果给定的前缀不在前缀树中,则返回 0

🍁代码:(Java、C++)

Java

class TrieNode{
    int val;
    TrieNode[] children = new TrieNode[26];
    TrieNode(){
        this.val = 0;
        for(int i = 0; i < 26; i++){
            this.children[i] = null;
        }
    }
}

class MapSum {
    private TrieNode root;
    private Map<String, Integer> cnt;

    public MapSum() {
        this.root = new TrieNode();
        cnt = new HashMap();
    }
    
    public void insert(String key, int val) {
        int num = val - cnt.getOrDefault(key, 0);
        cnt.put(key, val);
        TrieNode node = root;
        for(char c : key.toCharArray()){
            if(node.children[c - 'a'] == null){
                node.children[c - 'a'] = new TrieNode();
            }
            node = node.children[c - 'a'];
            node.val += num;
        }
    }
    
    public int sum(String prefix) {
        TrieNode node = root;
        for(char c : prefix.toCharArray()){
            if(node.children[c - 'a'] == null){
                return 0;
            }
            node = node.children[c - 'a'];
        }
        return node.val;
    }
}

/**
 * Your MapSum object will be instantiated and called as such:
 * MapSum obj = new MapSum();
 * obj.insert(key,val);
 * int param_2 = obj.sum(prefix);
 */

C++

struct TrieNode{
    int val;
    TrieNode* children[26];
    TrieNode(){
        this->val = 0;
        for(int i = 0; i < 26; i++){
            this->children[i] = nullptr;
        }
    }
};

class MapSum {
private:
    TrieNode* root;
    unordered_map<string, int> cnt;
public:
    MapSum(){
        this->root = new TrieNode();
    }
    
    void insert(string key, int val) {
        int num = val;
        if(cnt.count(key)) {
            num -= cnt[key];
        }
        cnt[key] = val;
        TrieNode* node = root;
        for(auto c : key){
            if(node->children[c - 'a'] == nullptr){
                node->children[c - 'a'] = new TrieNode();
            }
            node = node->children[c - 'a'];
            node->val += num;
        }
    }
    
    int sum(string prefix) {
        TrieNode* node = root;
        for(auto c : prefix){
            if(node->children[c - 'a'] == nullptr){
                return 0;
            }else{
                node = node->children[c - 'a'];
            }
        }
        return node->val;
    }
};

/**
 * Your MapSum object will be instantiated and called as such:
 * MapSum* obj = new MapSum();
 * obj->insert(key,val);
 * int param_2 = obj->sum(prefix);
 */

🚀 运行结果:

在这里插入图片描述

🕔 复杂度分析:

  • 时间复杂度insert 操作时间复杂度为 O ( n ) O(n) O(n),其中 n 是插入的字符串 key 的长度。sum 操作时间复杂度为 O ( n ) O(n) O(n),其中 O ( n ) O(n) O(n) 为给定的查询字符的长度,需要在前缀树中搜索给定的前缀。

  • 空间复杂度 O ( c n m ) O(cnm) O(cnm),其中 m 表示 key-val 键值的数目,n 表示字符串 key 的最大长度,c 为常数。

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我 leetCode专栏,每日更新!

注: 如有不足,欢迎指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/456042.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Scrapy框架 -- 深度爬取并持久化保存图片

一、新建一个Scrapy项目daimg scrapy startproject daimg 二、进入该项目并创建爬虫文件daimgpc cd daimg scrapy genspider daimgpc www.xxx.com 三、修改配置文件settings.py ROBOTSTXT_OBEY False LOG_LEVEL ERROR USER_AGENT "Mozilla/5.0 (Windows NT 10.0; …

Git快速入门

Git快速入门 版本控制什么是版本控制常见的版本控制工具版本控制分类Git与SVN的主要区别 聊聊Git的历史Git环境配置软件下载启动GitGit配置 Git基本理论&#xff08;重要&#xff09;三个区域工作流程 Git项目搭建创建工作目录与常用指令本地仓库搭建克隆远程仓库 Git文件操作文…

Springsecurity课程笔记06-13章基于数据库的方法授权

动力节点Springsecurity视频课程 6 密码处理 6.1 为什么要加密&#xff1f; csdn 密码泄露事件 泄露事件经过&#xff1a;https://www.williamlong.info/archives/2933.html 泄露数据分析&#xff1a;https://blog.csdn.net/crazyhacking/article/details/10443849 6.2加密…

平均薪资28K,测试开发的涨薪史,给我看哭了...

金三银四的涨薪季要来了&#xff0c;看着身边的同事有的晋升&#xff0c;有的收获30%的涨薪&#xff0c;他们都拥有哪些影响涨薪的硬核技能呢&#xff1f;互联网行业的高薪是众所周知的&#xff0c;而测试作为互联网公司越来越重视的技术开发模块&#xff0c;薪资收入同样一路走…

Tomcat部署与优化

前言 Tomcat是一款免费、开放源代码的Web应用服务器&#xff0c;是Apache软件基金会的一个核心开源项目&#xff0c;属于轻量级应用服务器&#xff0c;通常意义上的 Web 服务器接受请求后&#xff0c;只是单纯地响应静态资源&#xff0c;如 HTML 文件&#xff0c;图片文件等&a…

深入探究C++中的仿函数和迭代器——提升你的STL技能

&#x1f4d6;作者介绍&#xff1a;22级树莓人&#xff08;计算机专业&#xff09;&#xff0c;热爱编程&#xff1c;目前在c&#xff0b;&#xff0b;阶段>——目标Windows&#xff0c;MySQL&#xff0c;Qt&#xff0c;数据结构与算法&#xff0c;Linux&#xff0c;多线程&…

若依/RuoYi-Vue,若依管理系统-启动步骤

若依RuoYi-Vue前后端项目启动流程_若依前端怎么启动_primary taste_mm的博客-CSDN博客若依官网&#xff1a;RuoYi 若依官方网站 |后台管理系统|权限管理系统|快速开发框架|企业管理系统|开源框架|微服务框架|前后端分离框架|开源后台系统|RuoYi|RuoYi-Vue|RuoYi-Cloud|RuoYi框架…

进驻Lidl利多超市利器—— EDI

Lidl利多超市是源自德国的跨国零售企业&#xff0c;成立于1973年&#xff0c;发展迅速&#xff0c;目前在欧洲拥有10,800多家门店&#xff0c;覆盖29个国家。Lidl的业务范围包括食品、饮料、家庭用品、家具、电器等多个品类。Lidl一直致力于提供高性价比的商品&#xff0c;以满…

FIT2CLOUD飞致云发布开源轻量级云管平台CloudExplorer Lite

2023年4月21日&#xff0c;中国领先的开源软件公司FIT2CLOUD飞致云正式发布开源轻量级云管平台项目CloudExplorer Lite。CloudExplorer Lite&#xff08;https://github.com/CloudExplorer-Dev&#xff09;脱胎于飞致云创始软件产品CloudExplorer多云管理平台&#xff0c;支持对…

图表示学习算法学习

struc2vec: Learning Node Representations from Structural Identity learning latent representations for the structural identity of nodes. &#xff1a; 从结构特征中学习节点潜在表示 node representation : 节点表示 structural identity : 结构特征 struct2Vec是一个…

《UVM实战》学习笔记——第七章 UVM中的寄存器模型1——寄存器模型介绍、前门/后门访问

文章目录 前言一、寄存器模型简介1.1 带寄存器配置总线的DUT1.2 参考模型如何读取寄存器的值1.3 寄存器模型的基本概念 二、简单的寄存器模型2.1 只有一个寄存器的寄存器模型2.2 将寄存器模型集成到验证平台2.3 在验证平台中使用寄存器模型 三、前门访问和后门访问3.1 前门访问…

2023年淮阴工学院五年一贯制专转本应用文写作考试大纲

2023年淮阴工学院五年一贯制专转本应用文写作考试大纲 一、考核对象 本课程的考核对象是五年一贯制高职专转本秘书学专业普通在校生考生。 二、考核目的 通过课堂教学&#xff0c;学生应当能够识记、理解和应用有关应用文写作的基本理论和基本技能。其中&#xff0c;识记指…

TortoiseSVN使用-TortoiseSVN更换或重置登录用户

文章目录 3.4.9 TortoiseSVN更换或重置登录用户 本人其他相关文章链接 3.4.9 TortoiseSVN更换或重置登录用户 1&#xff0c;打开SVN的settings 2&#xff0c;找到Saved Data栏&#xff0c;右侧Authentication data项点击清除按钮clear 3&#xff0c;再次打开SVN&#xff0c;会要…

AgentGPT已成气候

AgentGPT之前也有介绍过&#xff0c;它最主要的功能是在ChatGPT的功能基础上&#xff0c;允许你自己自定义配置部署&#xff0c;根据你给出的命令&#xff0c;它将尝试通过思考&#xff0c;和执行&#xff0c;不用重复的给它发送指令&#xff0c;直接给你汇总好结果。 安装步骤…

牛客网刷题总结

1.利用%符号获取特定位数的数字。 2.强制类型转换 &#xff08;将float转换为int &#xff09; 3.计算有关浮点型数据时&#xff0c;要注意你计算过程中所有的数据都是浮点型 4.0/3.0 ! 4/3 4.通过位操作符实现输出2的倍数&#xff08;对于位操作符不熟悉的小伙伴可以看看我…

StringBuffer类详解

StringBuffer 定义 1.java.lang.StringBuffer代表可变的字符序列&#xff0c;可以对字符串内容进行增删 2.很多方法与String相同&#xff0c;但StringBuffer是可变长度的。 3.StringBuffer是一个容器。 String和StringBuffer的不同 1.String保存的是字符串常量&#xff0c…

机器学习——用KNN解决非线性回归问题

问&#xff1a;k最近邻分类模型是非线性模型。 答&#xff1a;正确。k最近邻分类模型是非线性模型&#xff0c;因为它的决策边界是由最近邻居点的类别决定的&#xff0c;而最近邻居点的分布通常是不规则的&#xff0c;因此决策边界也就不是线性的。因此&#xff0c;k最近邻分类…

继续【Stable-Diffusion WEBUI】方方面面研究(内容索引)

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;绘图&#xff08;1.1&#xff09;模型&#xff08;1.1.1&#xff09;基础模型&#xff08;Stable-diffusion模型&#xff09;&#xff08;1.1.2&#xff09;人物模型&#xff08;LoRA模型&#xff09; &…

我在公司彻夜撸码,老板天天开X6夜店蹦迪,到头来工资还拖欠

讲道理&#xff0c;我的学历远达不到BAT等名企大厂的要求&#xff0c;去不了好公司我认了&#xff0c;大专毕业的我在找工作的时候发现留给自己的机会并不多&#xff0c;最后去了一家不知名的小公司。入职后才发现这家公司其实就是个外包公司&#xff0c;里面的业务部门和制度相…

【RPA开发】Selenium 实现网页自动化

开发时有时会遇到网页爬取限制的情况&#xff0c;那么此时可以通过 Selenium 来解决这个问题&#xff0c;因为 Selenium 是模拟浏览器执行网页爬取&#xff0c;相比 Request/API 操作更安全&#xff0c;服务器会完全认为是用户在用浏览器进行操作&#xff0c;如此可以实现网页自…