面試算法之哈希專題

贖金信

在這里插入圖片描述

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.pswp.cn/web/12289.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/12289.shtml
英文地址,請注明出處:http://en.pswp.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…

在buildroot中自動給kernel打補丁

我的這個buildroot是管理在git上面的&#xff0c;所以這里我直接使用git format-patch 生成patch。 下面我詳細列舉一下步驟 1&#xff0c;將沒有修改的kernel復制出來一份&#xff0c;進入kernel目錄&#xff0c;執行git init&#xff0c;add所有文件并commit 2&#xff0c…

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…

EM算法與變分推斷

符號說明 x x x&#xff1a;已觀測變量的集合 { x 1 , x 2 , x 3 , . . . , x N } \{x_1,x_2,x_3,...,x_N\} {x1?,x2?,x3?,...,xN?}&#xff0c;長度為 N N N z z z&#xff1a;隱變量&#xff08;未觀測變量&#xff09; θ \theta θ&#xff1a;分布參數 ( x , z ) (x,…

pdffactory pro8.0虛擬打印機(附注冊碼)

PdfFactory pro是一款非常受歡迎的PDF虛擬打印機&#xff0c;可以幫助用戶將你的其他文檔保存為PDF格式。請為用戶提供打印/發送/加密等多種實用功能&#xff0c;以及一套完善的PDF打印方案。 使用說明 下載pdfFactory Pro壓縮包&#xff0c;解壓后&#xff0c;雙擊exe文件&am…

LeetCode_LCR002做題總結(可變字符序列使用)

LCR 002. 二進制求和 方法一方法二遺落知識點字符串長度stringStringBuffer && StringBuilder 方法一 轉換成十進制數&#xff0c;求和之后再轉換成二進制數 class Solution {public String addBinary(String a, String b) {return Integer.toBinaryString(Integer.p…

算法提高之木棒

算法提高之木棒 核心思想&#xff1a;dfs 剪枝優化 1.搜索順序優化&#xff1a;len從小到大遍歷2**.剪枝(失敗后)&#xff1a;** (1) 跳過所有和第i根木棍相同長度的木棍(2) 如果當前木棍是新木棒的第一根就失敗了 則之后不會搜到方案 return false(3) 下一根失敗但是上一根成…

java獲取到泛型信息后,需要包裝到另一個父類型中。比如讀取類型R,包裝成Res<R>

問題 對于json解析來說&#xff0c;我們一般是通過jackson的TypeReference或者XXX.class來制定類型&#xff08;其他json框架同理&#xff09;&#xff0c;比如下列代碼&#xff1a; ResponseBody<XxxClass> body JsonUtils.parseObject(response, new TypeReference&…

vue + element-plus項目做管理系統常用的組件,以及一些方便開發的設置

1.簡化路徑 //vite.consfig.ts import { defineConfig, ConfigEnv } from vite import vue from vitejs/plugin-vue import path from path export default defineConfig(({ command }: ConfigEnv) > {return {plugins: [vue(),],resolve: {alias: {: path.resolve(__dirn…

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;影響使用者的心情和健康&…