在代码随想录的介绍中, 哈希表是根据关键码的值而直接进行访问的数据结构,哈希法涉及三种数据结构,分别是数组、集合set 和 映射map(将任何基本类型映射到任何基本类型),适用于快速判断一个元素是否出现在集合中的问题。在这里,数组也可以理解成一种哈希表(下标为关键码),不严格区分定义。
set 和 map 分别提供以下三种数据结构(有序不重复,有序重复,无序不重复),关于哈希集合的具体介绍和相关函数可见上一篇文章:[C++学习] 链表 相交链表 环形链表II 代码随想录 LeetCode题 代码 笔记-CSDN博客
一、LeetCode题 242.有效的字母异位词 242. 有效的字母异位词 - 力扣(LeetCode)
题目描述:
1、利用数组记录字符串 s 中不同字母出现的个数(nums[c-'a']++),再检查字符串 t 中是否出现了这些字母(nums[c-'a']--)。由于字符串长度相同,当 t 中出现新字母时,数组中记录该字母的个数将小于 0,此时不构成字母异位词。
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.length() != t.length()) return false;
vector<int> nums(26,0);
for(auto c:s){
nums[c - 'a']++;
}
for(auto c:t){
nums[c - 'a']--;
if(nums[c - 'a'] < 0){
return false;
}
}
return true;
}
};
2、利用哈希表实现上述过程,unordered_map 的 key 为26个字母,value 为字母出现的个数。在数据量大的情况下,利用数组更为简单高效,map 的空间消耗大,且做哈希函数是费时的。
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.length() != t.length()) return false;
unordered_map<char,int> nums;
for(auto c:s){
nums[c]++;
}
for(auto c:t){
nums[c]--;
if(nums[c] < 0){
return false;
}
}
return true;
}
};
3、排序: 对字符串 s 和 t 进行排序,比较是否相等。
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.length() != t.length()) return false;
sort(s.begin(), s.end());
sort(t.begin(), t.end());
if(s==t) return true;
return false;
}
};
二、LeetCode题 383. 赎金信 383. 赎金信 - 力扣(LeetCode)
题目描述:
代码:与上一道题思路类似。
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
vector<int> nums(26,0);
for(auto c:magazine){
nums[c - 'a']++;
}
for(auto c:ransomNote){
nums[c - 'a']--;
if(nums[c - 'a'] < 0){
return false;
}
}
return true;
}
};
本文根据代码随想录顺序刷题。代码随想录 (programmercarl.com)