哈希表-有效字母异位词&两个数组的交集

哈希表

有效字母异位词

给定两个字符串 st ,编写一个函数来判断 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;
    }
};

两个数组的交集

给定两个数组 nums1nums2 ,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序

这道题主要学会使用一种哈希数据结构 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());
    }
};
posted @ 2026-03-05 13:50  wenyiGamecpp  阅读(13)  评论(0)    收藏  举报