面试算法之哈希专题

赎金信

在这里插入图片描述

class Solution {
public:bool canConstruct(string ransomNote, string magazine) {// 小写字母int r_cnt[26];int m_cnt[26];for(int i = 0; i< magazine.size(); i++) {m_cnt[magazine[i]-'a']++; // 统计}// 对比for(int i = 0; i< ransomNote.size(); i++) {if(m_cnt[ransomNote[i]-'a']) {m_cnt[ransomNote[i]-'a']--;} else {return false;}}return true;}
};
class Solution {
public:bool canConstruct(string ransomNote, string magazine) {// 小写字母int r_cnt[26];int m_cnt[26];for(int i = 0; i< magazine.size(); i++) {m_cnt[magazine[i]-'a']++; // 统计}// 对比for(int i = 0; i< ransomNote.size(); i++) {if(m_cnt[ransomNote[i]-'a']) {m_cnt[ransomNote[i]-'a']--;} else {return false;}}return true;}
};

同构字符串

在这里插入图片描述

class Solution {
public:bool isIsomorphic(string s, string t) {unordered_map<char,char> s_map;unordered_map<char,char> t_map;int s_size = s.size();int t_size = t.size();if(s_size != t_size) {return false;} for(int i = 0; i< s_size; i++) {char x = s[i];char y = t[i];if((s_map.count(x) && s_map[x] != y) || (t_map.count(y) && t_map[y] != x)) {return false;}s_map[x] = y;t_map[y] = x;}return true;    }
};

收获

了解了一下 有关于 unordered_map 中 count 函数的使用
s_map.count(x) 就是 键为 x 的个数

逐步解析
在这里插入图片描述

方法二
思路

通过 match 建立关系
通过 count 记录 t[i] 是否已经有映射

这部分是表示, 不存在 s[i] 的映射, 但是发现 t[i] 已经做好映射了 ( count[t[i]] > 0 ) 直接返回 false

  			if (match[s[i]] == '\0') { // 如果当前字符没有映射关系if (count[t[i]] == 0) { // 如果当前字符在t中没有出现过match[s[i]] = t[i]; // 建立映射关系count[t[i]] = 1; // 将该字符在t中的出现次数加1}elsereturn false; // 如果当前字符在t中已经出现过,则返回false}

在这里插入图片描述
图解
在这里插入图片描述

class Solution {
public:bool isIsomorphic(string s, string t) {unordered_map<char, char> match; // 用于存储字符之间的映射关系unordered_map<char, int> count; // 用于记录字符在t中出现的次数for (int i = 0; i < s.size(); i++) {if (match[s[i]] == '\0') { // 如果当前字符没有映射关系if (count[t[i]] == 0) { // 如果当前字符在t中没有出现过match[s[i]] = t[i]; // 建立映射关系count[t[i]] = 1; // 将该字符在t中的出现次数加1}elsereturn false; // 如果当前字符在t中已经出现过,则返回false}else { // 如果当前字符已经有映射关系if (match[s[i]] != t[i]) { // 如果映射关系不正确return false; // 返回false}}}return true; // 所有字符都满足同构条件,返回true}
};
class Solution {
public:bool wordPattern(string pattern, string s) {unordered_map<string,char> s_patterMap;unordered_map<char, string> pattern_sMap;// 遍历int p_len = pattern.size();int left = 0;int right = 0;for(int i = 0; i< p_len ; i++) {if(left >= s.size()) {return false;}// 遍历while(right < s.size() && s[right] != ' ') right++;// 右边界 right string str = s.substr(left, right-left);if(s_patterMap.count(str) && s_patterMap[str] != pattern[i]) {return false;}if(pattern_sMap.count(pattern[i]) && pattern_sMap[pattern[i]] != str) {return false;}s_patterMap[str] = pattern[i];pattern_sMap[pattern[i]] = str;left = right + 1;right = left;}if(right < s.size()) {return false;} else {return true;}}
};

有效的字母异位词

在这里插入图片描述
方法一: 使用长度为 26 的数组对 小写字母进行统计

class Solution {
public:bool isAnagram(string s, string t) {// 用数组统计字母次数就可以了int s_char[26];int t_char[26];for(int i = 0; i< s.size(); i++) {s_char[s[i] - 'a']++;} for(int i = 0; i< t.size() ; i++) {t_char[t[i] - 'a'] ++;}for(int i = 0; i< 26; i++) {if(s_char[i] != t_char[i]) {return false;}}return true;}
};

方法二: 使用 unordered_map 进行统计

  • 对比字符串长度
  • 记录一个字符串字母组成
  • 遍历另外一个字符串, 然后做减法
class Solution {
public:bool isAnagram(string s, string t) {unordered_map<char,int> s_char;// 长度对比if(s.size() != t.size()) {return false;}for(int i = 0; i< s.size(); i++) {s_char[s[i]]++;} // 遍历 t 字符串for(auto c : t){if(--s_char[c] < 0) return false;}   return true;}
};

49. 字母异位分组

在这里插入图片描述
注意:

这里有个很好的思路, 如果是相同字母组成的单词, 对单词进行排序后, 肯定是相等, 所以通过遍历,然后对单词排序,
然后加入到 unordered_map<string, vector> 中就 , 后面就是对 unordered_map 进行遍历

要点
① 对一个单词进行排序

string str = "afdaf";
sort(str.begin(), str.end())

② 对 unordered_map<string , vector> 操作
加入

mp[key].emplace_back(strs[i]);

③ 对 unordered_map<string, vector> 遍历操作

for(auto pair: mp) {vector<string> values = pair.second;for(auto value: values) {cout<<value<<endl;}// ......
}
class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {// 分组vector<vector<string>> result; // 结果if(strs.size() == 0  || strs.size() == 1) {result.push_back(strs);return result;}// 如果是同一组字母组成的单词, 排序后 可以画上等号unordered_map<string, vector<string>> mp; // 表示一种组合 所有单词 后面表示字符数组for(int i = 0; i< strs.size() ; i++) {string key = strs[i];sort(key.begin(), key.end());mp[key].emplace_back(strs[i]);}// 遍历 这个 mapfor(auto pair: mp) {result.emplace_back(pair.second);}return result;}
};

两数之和

在这里插入图片描述

class Solution {
public:vector<int> twoSum(vector<int>& nums, int target) {// unordered_map<int,int> value;for(int i = 0; i< nums.size(); i++) {if(value.find(target - nums[i]) != value.end()) {auto it = value.find(target - nums[i]);return {it->second,i};}value[nums[i]] = i;}return {};}
};

思考: 如果不止一种结果,代码又是如何写呢???

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

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

相关文章

使用vant-ui+vue3实现一个可复用的评星组件

如图所示 有两种情况 一种是5颗星 一种是3颗星 官网上只提供了图标类型的 并没有加文字 https://femessage-vant.netlify.app/#/zh-CN/ 自己结合两种情况 在全局注册了此组件(后续还会持续更新代码~) <template><div class"vant_rate_wrapper"><van…

【Javaer学习Python】 1、Django安装

安装 Python 和 PyCharm 的方法就略过了&#xff0c;附一个有效激活PyCharm的链接&#xff1a;https://www.quanxiaoha.com/pycharm-pojie/pycharm-pojie-20241.html 1、安装Django # 安装Django pip install Django# 查看当前版本 python -m django --version 5.0.62、创建项…

HTML常用标签-表格标签

表格标签 1 常规表格2 单元格跨行3 单元格跨行 1 常规表格 table标签 代表表格 thead标签 代表表头 可以省略不写 tbody标签 代表表体 可以省略不写 tfoot标签 代表表尾 可以省略不写 tr标签 代表一行 td标签 代表行内的一格 th标签 自带加粗和居中效果的td 代码 <h…

探索数据结构:堆的具体实现与应用

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 堆的概念 堆(Heap)是计算机科学中一类特殊的数据结构。堆通常是一个…

C++ QT设计模式 (第二版)

第3章 Qt简介 3.2 Qt核心模块 Qt是一个大库&#xff0c;由数个较小的库或者模块组成&#xff0c;最为常见的如下&#xff1a;core、gui、xml、sql、phonon、webkit&#xff0c;除了core和gui&#xff0c;这些模块都需要在qmake的工程文件中启用 QTextStream 流&#xff0c;Qdat…

2024年高考倒计时精品网页

2024年高考倒计时精品网页 前言效果图部分代码领取源码下期更新预报 前言 随着季风轻轻掠过&#xff0c;岁月如梭&#xff0c;再次迎来了这个属于青春与梦想交汇的时刻——高考。这是一场知识的较量&#xff0c;更是一次意志的考验。在这最后的冲刺阶段&#xff0c;每一刻都显…

可视化 FlowChart 0.4.1 最强的拖拽组件

主要解决以及目标&#xff1a; ti-flowchart 能满足 二次开发的大部分需求。 下发GIF图可见&#xff0c;左边的模块A 由二次开发人员设计&#xff0c;通过向flowchart注册模块Dom&#xff0c;实现符合拖拽&#xff0c;编辑&#xff0c;布局&#xff0c;以及响应事件上抛。 实…

vaspkit 画 Charge-Density Difference

(echo 314;echo $(cat 1))|vaspkit 文件1提前写好使用的CHGCAR路径 SPIN_DW.vasp ../ML2scf/SPIN_DW.vasp ../ML1scf/SPIN_DW.vasp POSite and negative 默认为blue,and 青色 (RGB 30 245 245) 正值&#xff1a;blue 。负值&#xff1a;青色 RGB 30 245 245。 提示&…

(深度估计学习)Win11复现DepthFM

目录 1. 系统配置2. 拉取代码&#xff0c;配置环境3.开始深度预测4.运行结果 论文链接&#xff1a;https://depthfm.github.io/ 讲解链接&#xff1a;https://www.php.cn/faq/734404.html 1. 系统配置 本人系统&#xff1a;Win11 CUDA12.2 python3.11.5 这里附上几个CUDA安装链…

[Cesium]Cesium基础学习——Primitive

Cesium开发高级篇 | 01空间数据可视化之Primitive - 知乎 Primitive由两部分组成&#xff1a;几何体&#xff08;Geometry&#xff09;和外观&#xff08;Appearance&#xff09;。几何体定义了几何类型、位置和颜色&#xff0c;例如三角形、多边形、折线、点、标签等&#xff…

pdffactory pro8.0虚拟打印机(附注册码)

PdfFactory pro是一款非常受欢迎的PDF虚拟打印机&#xff0c;可以帮助用户将你的其他文档保存为PDF格式。请为用户提供打印/发送/加密等多种实用功能&#xff0c;以及一套完善的PDF打印方案。 使用说明 下载pdfFactory Pro压缩包&#xff0c;解压后&#xff0c;双击exe文件&am…

EEL中 python端的函数名是如何传递给js端的

python端的函数名是如何传递给js端的 核心步骤&#xff1a;将函数名列表注入到动态生成的 eel.js 中&#xff0c;这样前端一开始引用的eel.js本身已经包含有py_function的函数名列表了。你打开开发者工具看看浏览器中的 eel.js文件源代码就知道了。 具体实现&#xff1a; # 读…

全面解析OpenAI的新作——GPT-4o

5月14日凌晨1点、太平洋时间的上午 10 点&#xff0c;OpenAI的GPT-4o的横空出世&#xff0c;再次巩固了其作为行业颠覆者的地位。GPT-4o的发布不仅仅是一个产品的揭晓&#xff0c;它更像是向世界宣告AI技术已迈入了一个全新的纪元&#xff0c;连OpenAI的领航者萨姆奥特曼也不禁…

楼宇智慧公厕建设新方案-集成更简单!成本价更低!

在当今的大厦和写字楼中&#xff0c;公厕面临着诸多痛点。 办公楼公厕常常存在厕位难找的问题&#xff0c;使用者不得不花费时间逐一查看&#xff0c;导致效率低下&#xff1b;环境质量也令人担忧&#xff0c;异味、脏污等情况时有发生&#xff0c;影响使用者的心情和健康&…

【simulink】Scrambling 加扰

https://ww2.mathworks.cn/help/comm/ug/additive-scrambling-of-input-data-in-simulink.html 草图 simulink 代码图

QT状态机10-QKeyEventTransition和QMouseEventTransition的使用

1、QMouseEventTransition的使用 首先明白 QMouseEventTransition 继承自 QEventTransition类。 关于QEventTransition类的使用,可参考 QT状态机9-QEventTransition和QSignalTransition的使用 回顾 QT状态机9-QEventTransition和QSignalTransition的使用 中的状态切换代码,如…

零基础10 天入门 Web3之第3天

10 天入门 Web3之第3天 什么是以太坊&#xff0c;以太坊能做什么&#xff1f;Web3 是互联网的下一代&#xff0c;它将使人们拥有自己的数据并控制自己的在线体验。Web3 基于区块链技术&#xff0c;该技术为安全、透明和可信的交易提供支持。我准备做一个 10 天的学习计划&…

AI+新能源充电桩数据集

需要的同学私信联系&#xff0c;推荐关注上面图片右下角的订阅号平台 自取下载。 随着我国新能源汽车市场的蓬勃发展&#xff0c;充电桩的需求量日益增加&#xff0c;充电桩的智能化程度不仅影响充电站运营商的经营效益&#xff0c;也大大影响着用户的充电体验。AI技术可以涵盖…

python “名称空间和作用域” 以及 “模块的导入和使用”

七、名称空间和作用域 可以简单理解为存放变量名和变量值之间绑定关系的地方。 1、名称空间 在 Python 中有各种各样的名称空间&#xff1a; 全局名称空间&#xff1a;每个程序的主要部分定义了全局的变量名和变量值的对应关系&#xff0c;这样就叫做全局名称空间 局部名称…

04-单片机商业项目编程,从零搭建低功耗系统设计

一、本文内容 上一节《03-单片机商业项目编程&#xff0c;从零搭建低功耗系统设计-CSDN博客》我们确定了设计思路&#xff0c;并如何更有效的保持低功耗&#xff0c;这节我们就准备来做软件框架设计。在AI飞速发展的时代&#xff0c;我们也会利AI来辅助我们完成&#xff0c;让自…