[C++学习] 哈希表 242.有效的字母异位词 383. 赎金信 代码随想录 LeetCode题 代码 笔记

        在代码随想录的介绍中, 哈希表是根据关键码的值而直接进行访问的数据结构,哈希法涉及三种数据结构,分别是数组集合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)  

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值