当前位置: 首页 > news >正文

leetcode 力扣刷题哈希表初尝试

哈希表 刷题初尝试

  • 哈希表基础知识
  • 242. 有效的字母异位词
  • 383. 赎金信
  • 49. 字母异位词分组
  • 438. 找到字符串中所有字母异位词

哈希表基础知识

哈希表是一种数据结构,也叫散列表。哈希表中存储的是键值对,即(key,value),根据key直接查找到对应value,也能快速查找key是否在哈希表中,时间复杂度是O(1)。理解:可以把数组看作是哈希表,把数组下标index看作是key,对应下标中存储的是value,通过key查找元素的时候,就像是通过下标index访问数组,直接定位array[index]。
哈希表查找元素时,将key通过哈希函数(hashfunction)后映射为索引,通过该索引找到对应存储的value。

242. 有效的字母异位词

242. 有效的字母异位词
题目描述:【其实我没懂为什么这道题会跟哈希表扯上关系】在这里插入图片描述
理解题意:重点是“什么是字母异位词?”——实际上就是两个单词(字符串)中的字母及其出现的次数都一样,但是出现的顺序不一样。
理解题意后,解题思路就很清晰了,分别遍历s和t,统计其中出现的各个字符及其次数,最后对比这些字符及次数是否完全相等。因为题目中提到都是小写字母,因此用一个长度为26(只有26个小写英文字母),初始化全为0的数组count来记录字符串中各字母出现的次数。在遍历s的时候,对count[s[i]-‘a’]++,表示s中出现的各个字母及其次数;在遍历t的时候,对count[t[i]-‘a’]- -,表示t中出现的各个字母,及能否抵消掉s中该字母出现的次数;【注意直接用s[i]-'a’表示26个字母数组的下标是一种常用操作】最后遍历count数组,如果全为0,表示s和t是字母异位词,如果count中存在不为0的元素,就表示t不完全包括s中需要的字母(或s中不完全包括t中需要的字母)。
代码如下(C++):

class Solution {
public:bool isAnagram(string s, string t) {//如果两者长度不一样,肯定不是字母异位词if(s.size() != t.size())return false;//统计各字母出现的次数int count[26] = {0};//遍历s,统计其中出现的字母及其次数for(int i = 0; i < s.size(); i++){count[s[i] - 'a']++;}//遍历tfor(int i = 0; i < t.size(); i++){count[t[i] - 'a']--;}for(int i = 0; i < 26; i++){//如果有不为0的元素,表示在该字母上,s和t出现的次数不一样if(count[i] != 0) return false;}return true;}
};

383. 赎金信

383. 赎金信
题目内容:在这里插入图片描述
ransomNote和magazine都由英文小写字母组成。理解题意,实际和上一题,字母异位词差不多,只是在字母异位词中,两个字符串中出现的字母及其次数必须完全一样,在这道题中,用magazine来组成ransomNote【提到magazine中每个字符只能在ransomNote中用一次,是比如ransomNote中有2个a,那么magazine中至少得有2个a才能满足要求】,实际上是要求ransomNote中需要的字母在magazine中都存在,并且magazine中这些字母的次数>ransomNote中出现的次数
实现过程同样是用count[26]数组来记录出现字母及其次数。先遍历ransomNote,对count[ransomNote[i]-‘a’]- -,表示ransomNote对该字母的需求量;再遍历magazine,对count[magazine[i]-‘a’]++,表示magazine对该字母的提供量;最后如果count中存在<0的元素,说明ransomNote中该字母的需求,magazine不能满足,不能满足题意,返回false。【相反>=0,都是能够满足的】
代码实现(C++):

class Solution {
public:bool canConstruct(string ransomNote, string magazine) {//如果magazine中总的字符数小于ransomNote,直接返回falseif(magazine.size() < ransomNote.size())return false;int count[26] = {0};//统计ransomNote中各字母的需求量for(int i = 0; i < ransomNote.size(); i++){count[ransomNote[i]-'a']--;}//统计magazine中各字母的提供量for(int i = 0; i < magazine.size(); i++){count[magazine[i]-'a']++;}for(int i = 0; i < 26; i++){//如果有<0的说明magazine中该字母的提供量不能满足ransomNote中的需求量if(count[i] < 0)return false;}return true;}
};

49. 字母异位词分组

49. 字母异位词分组
题目内容:在这里插入图片描述
题目的关键点:①如何判断是字母异位词?方法Ⅰ. 字母异位词中出现的字母及其次数完全相同;方法Ⅱ. 字母异位词将字符串按照字母升序排序后是一样的;②如何对字母异位词分组?方法:哈希表,一组字母异位词key相同,字符串存到value中(很多个字符串怎么存,value用数组,比如vector); ③如何构造哈希表? 按照问题①的解决方案(两种对应最终的两种办法),将字符串变成键key,如果是字母异位词那么key是一样的,存到对应的value数组中,即可实现分组。
本题以及哈希表相关题目最最最关键的是,找到是要对什么构造哈希表,什么是key,什么是value。
两种代码分别如下(C++):

class Solution {
public://方法Ⅰ,把字符串按照字母升序排序得到键key,构造哈希表vector<vector<string>> groupAnagrams(vector<string>& strs) {unordered_map<string, vector<string>> ans_map; //注意key对应的value是字母异位词构成的vectorvector<vector<string>> ans;//遍历每一个字符串for(string& str_i : strs){string key = str_i;//使用字符串排序后的结果作为keysort(key.begin(), key.end());//将字符串加入到对应的key的value vactor中ans_map[key].emplace_back(str_i);}//取哈希表每个key对应的value(字母异位词分组)for(auto& ans_i : ans_map){ans.emplace_back(ans_i.second);}return ans;}
};class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {unordered_map<string, vector<string>> ans_map;vector<vector<string>> ans;//方法Ⅱ,把字符串中各个字母出现的次数构成key【比如aabccc,key是"213000……000"】for(string& str_i : strs){string key = string(26, '0');for(auto char_i : str_i)key[char_i-'a']++;//将字符串加入到对应的key的value vector中ans_map[key].emplace_back(str_i);}for(auto& ans_i : ans_map){ans.emplace_back(ans_i.second);}return ans;}
};

438. 找到字符串中所有字母异位词

438. 找到字符串中所有字母异位词
题目内容:【我不知道为什么一定要扯上滑动窗口,这道题不就是遍历s中所有和p长度一样的子串并判断嘛???】
在这里插入图片描述
理解题意,同样是判断字母异位词;遍历s中所有长度为p.len的子串,然后判断是不是p的字母异位词。怎么遍历子串呢?有一个start一个end,start=0,然后依次移动,end也是;子串移动的过程中,子串的字母及次数数组,对start的- -,对end的++。
代码如下(C++):

class Solution {
public:vector<int> findAnagrams(string s, string p) {vector<int> ans;int s_len = s.size(), p_len = p.size();//如果s比p短,直接返回空结果if(s_len < p_len) return ans; //统计子串和p中字母及其次数        vector<int> subCount(26,0), pCount(26,0);for(int i = 0; i < p_len; i++){subCount[s[i]-'a']++;pCount[p[i]-'a']++;}//对于第一个子串,先判断if(pCount == subCount)   ans.emplace_back(0);for(int start = 0; start < s_len - p_len; start++ ){//移动到下一个子串            subCount[s[start] - 'a']--; //start对应字母次数--subCount[s[start + p_len] - 'a']++;  //end对应字母次数++(没有用额外的变量end表示,直接用start+p_len//判断新子串和p是否是字母异位词if(subCount == pCount){ans.emplace_back(start + 1);}         }return ans;}
};

相关文章:

leetcode 力扣刷题哈希表初尝试

哈希表 刷题初尝试 哈希表基础知识242. 有效的字母异位词383. 赎金信49. 字母异位词分组438. 找到字符串中所有字母异位词 哈希表基础知识 哈希表是一种数据结构&#xff0c;也叫散列表。哈希表中存储的是键值对&#xff0c;即(key&#xff0c;value)&#xff0c;根据key直接查…...

Docker 本地镜像发布到私有仓库

1. 本地镜像发布到私有库流程 2. 是什么 1 官方Docker Hub地址&#xff1a;https://hub.docker.com/&#xff0c;中国大陆访问太慢了且准备被阿里云取代的趋势&#xff0c;不太主流。 2 Dockerhub、阿里云这样的公共镜像仓库可能不太方便&#xff0c;涉及机密的公司不可能提供镜…...

计算机网络和 Internet 的基本概念

计算机网络和互联网&#xff08;Internet&#xff09;是现代计算机科技中的重要概念。它们为计算机之间的通信和数据交换提供了基础架构。以下是它们的基本概念&#xff1a; **计算机网络&#xff1a;** 计算机网络是指将多台计算机连接在一起&#xff0c;以便它们可以共享资…...

高并发数据抓取实战:使用HTTP爬虫ip提升抓取速度

又到每天一期学习爬虫的时间了&#xff0c;作为一名专业的爬虫程序员&#xff0c;今天要跟你们分享一个超实用的技巧&#xff0c;就是利用HTTP爬虫ip来提升高并发数据抓取的速度。听起来有点高大上&#xff1f;别担心&#xff0c;我会用通俗易懂的话来和你们说&#xff0c;让你…...

CSS3 中新增了哪些常见的特性?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 圆角&#xff08;Border Radius&#xff09;⭐ 渐变&#xff08;Gradients&#xff09;⭐ 阴影&#xff08;Box Shadow&#xff09;⭐ 文本阴影&#xff08;Text Shadow&#xff09;⭐ 透明度&#xff08;Opacity&#xff09;⭐ 过渡&…...

简单认识excel篇章1

excel是Office办公软件中的组件之一&#xff0c;它专长于对表格中的数据进行计算和统计管理&#xff0c;通常用于财务或其他数据管理的表格制作&#xff0c;同时excel还有很好的可视化能力&#xff0c;可用于制作各种行业报告。 在Microsoft Excel中&#xff0c;excel文件的后缀…...

CentOS系统环境搭建(九)——centos系统下使用docker部署项目

centos系统环境搭建专栏&#x1f517;点击跳转 关于Docker-compose安装请看CentOS系统环境搭建&#xff08;三&#xff09;——Centos7安装Docker&Docker Compose&#xff0c;该文章同样收录于centos系统环境搭建专栏。 Centos7部署项目 采用前后端分离的形式部署。使用Do…...

【科研论文配图绘制】task1 掌握科研绘图的基本知识

【科研论文配图绘制】task1 掌握科研绘图的基本知识 写在最前 8月份Datawhale组队学习&#xff0c;写下该博客记录学习内容 1.科研论文配图的分类与构成 2.科研论文配图的格式和尺寸 3.科研论文配图中的字体和字号设置 4.科研论文配图的版式设计、结构布局和颜色搭配 占个…...

YAML资源清单

目录 YAML资源清单 &#xff08;一&#xff09;YAML 语言 &#xff08;1&#xff09;基本语法 &#xff08;2&#xff09;支持的数据结构 &#xff08;二&#xff09;通过资源清单管理容器资源 YAML 语法格式&#xff1a; 创建Service资源清单 &#xff08;三&#xff…...

数据分析两件套ClickHouse+Metabase(二)

Metabase篇 Metabase安装部署 任何问题请查看 -> 官方文档 jar包从GitHub下载 -> 地址 同样有个问题, 默认数据源里没有ClickHouse, 不过ClickHouse官方提供了插件包 -> 插件包 在安装metabase目录下新建一个plugins文件夹, 把下载的clickhouse.metabase-driver.ja…...

神经网络基础-神经网络补充概念-20-激活函数

概念 激活函数是神经网络中的一个重要组成部分&#xff0c;它引入了非线性性质&#xff0c;使得神经网络可以学习和表示更复杂的函数关系。激活函数对于将输入信号转换为输出信号起到了关键作用&#xff0c;它在神经元的计算过程中引入了非线性变换。 几种常见的激活函数及其…...

欧拉函数和最大公约数

分析&#xff1a;如果两个数的最大公约数是一个质数p&#xff0c;那么这两个数都除以p&#xff0c;得到的两个数的最大公约数一定是1. 反证法&#xff1a;如果得到的两个数的最大公约数不是1&#xff0c;那么把此时的最大公约数乘以上边的最大公约数&#xff0c;得到的一定比上…...

出牌游戏(game)

安徽省2016年信息学竞赛试题(小学组) 题目描述 Description 小学生卡卡西最喜欢的电影是哈利波特&#xff0c;她一直幻想着自己可以进入神奇的魔法世界&#xff0c;今年暑假的一个傍晚&#xff0c;一只猫头鹰带着一封神秘的邀请函来到了她的家中&#xff0c;邀请函里是一张车…...

踩坑---uni-app中@input 事件不生效

在开发的时候遇到这么一种情况&#xff0c;我们希望input输入框的值是范围是0-100或者保留两位小数之类的&#xff0c;当你输入时处理后的结果却不生效&#xff0c;但是试过很多办法发现都实现不了&#xff0c;最后是按照以下方法解决的,问题原因是uni-app会延时,导致输入的结果…...

Linux命令(66)之tar

linux命令之tar 1.tar介绍 linux命令tar是压缩打包工具&#xff0c;可以将多个文件合并为一个文件&#xff0c;打包后的文件后缀为tar。与其它linux命令不同的是&#xff0c;tar命令的用户为linux的所有用户。 2.tar用法 tar [参数] [fliename.压缩打包后缀] [filename] ta…...

零拷贝详解

1、在没有DMA技术之前的I/O过程是这样的&#xff1a; CPU发出对应的指令给磁盘控制器&#xff0c;然后返回磁盘控制器收到指令后&#xff0c;于是就开始准备数据&#xff0c;会把数据放入到磁盘控制器的内部缓冲区&#xff0c;然后产生中断CPU收到中断信号后&#xff0c;停下手…...

新能源汽车电控系统

新能源汽车电控系统主要分为&#xff1a;三电系统电控系统、高压系统电控系统、低压系统电控系统 三电系统电控系统 包括整车控制器、电池管理系统、驱动电机控制器等。 整车控制器VCU 整车控制器作为电动汽车中央控制单元&#xff0c;是整个控制系统的核心&#xff0c;也是…...

Azure概念介绍

云计算定义 云计算是一种使用网络进行存储和处理数据的计算方式。它通过将数据和应用程序存储在云端服务器上&#xff0c;使用户能够通过互联网访问和使用这些资源&#xff0c;而无需依赖于本地硬件和软件。 发展历史 云计算的概念最早可以追溯到20世纪60年代的时候&#x…...

Zabbix监控MySQL数据库实战

zabbix监控mysql的方式 只是安装agent 启用模板监控 启用自定义脚本的模板监控 使用zabbix模版及结合shell脚本监控mysql 创建mysql的zabbix授权用户 mysql> grant all PRIVILEGES on *.* to zabbixlocalhost identified by zabbix; ###创建一个有权限的访问用户lqb密码设…...

代理模式(Java实现)

代理模式是常见的设计模式之一&#xff0c;顾名思义&#xff0c;代理模式就是代理对象具备真实对象的功能&#xff0c;并代替真实对象完成相应操作&#xff0c;并能够在操作执行的前后&#xff0c;对操作进行增强处理。&#xff08;为真实对象提供代理&#xff0c;然后供其他对…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

Caliper 配置文件解析:config.yaml

Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...