当前位置: 首页 > 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;然后供其他对…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...