哈希表-有效字母异位词&两个数组的交集
哈希表
有效字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的 字母异位词,就是两个字符串的字符数量要一样而且字母出现的次数也要一样
这题就可以使用哈希表思想来实现了,原理并不复杂,首先,a~z 一共26个字母,我们恰好可以使用数组来实现,hash[26],用这个数组来存储字符串中每个字母出现的次数,然后记录完之后,拿到的这个数组,给另一个字符串判断,出现就减去,如果有效字母异位,那么数组中应该全是0。
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.size() != t.size()) return false; // 如果长度不一样,那直接返回false
int hash[26] = {0};
for(int i = 0; i < s.size(); ++i){
++hash[s[i] - 'a'];
}
for(int j = 0; j < t.size(); ++j){
--hash[t[j] - 'a'];
}
for(auto num : hash){
if(num != 0) return false;
}
return true;
}
};
两个数组的交集
给定两个数组 nums1 和 nums2 ,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
这道题主要学会使用一种哈希数据结构 unordered_set,关于set,c++提供三种数据结构:
- std::set
- std::multiset
- std::unordered_set
unordered_set读写效率最高,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。代码并不复杂
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
std::unordered_set<int> num_set(nums1.cbegin(), nums1.cend());
std::unordered_set<int> result; // int型空集合
for(const auto& num : nums2){
if(num_set.find(num) != num_set.end()){
result.insert(num);
}
}
return vector<int> (result.begin(),result.end());
}
};

浙公网安备 33010602011771号