每日一题(LeetCode)----哈希表--赎金信

每日一题(LeetCode)----哈希表--赎金信

1.题目(383. 赎金信

  • 给你两个字符串:ransomNotemagazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。

    如果可以,返回 true ;否则返回 false

    magazine 中的每个字符只能在 ransomNote 中使用一次。

    示例 1:

    c++ 复制代码
    输入:ransomNote = "a", magazine = "b"
    输出:false

    示例 2:

    c++ 复制代码
    输入:ransomNote = "aa", magazine = "ab"
    输出:false

    示例 3:

    c++ 复制代码
    输入:ransomNote = "aa", magazine = "aab"
    输出:true

    提示:

    • 1 <= ransomNote.length, magazine.length <= 105
    • ransomNotemagazine 由小写英文字母组成

2.解题思路

思路一:哈希法

1.创建两个哈希表(这里用unordered_map),两个哈希表的键值都是遍历到的字符,实值是当前遍历到的字符出现的次数

2.遍历两个字符串,每遍历到一个字符,就看当前字符是否在对应的哈希表中出现过,没出现过我们就将当前元素和它出现的次数(此时为一)作为一个元素存入对应的哈希表中,出现过我们就将它的出现次数进行加一操作

3.遍历其中一个哈希表,每遍历到哈希表中的一个元素,我们就取出这个元素中的实值(也就是在第一个字符串中当前字符出现的次数),然后以当前哈希表中的键值(在第一个字符串中出现的字符)作为另一个哈希表中的键值(在第二个字符串中出现的字符)取出另一个的实值(也就是在第二个字符串中当前字符出现的次数),将两个实值进行比较,如果第一个实值比第二个实值大,那么返回失败,否则就继续进行遍历,如果遍历完第一个哈希表之后还没有返回失败,那么返回成功

思路二:字符统计法(用数组来实现的)

1.创建一个26个长度的数组用来记录每个字符出现的次数(因为这里题目说了两个字符串只由小写英文字母构成,所以我们这里创建的是26个长度的数组)

2.我们先遍历一遍magazine字符串,将magazine字符串中各个字符出现的次数存到数组中

3.我们再遍历一遍ransomNote 字符串,每遍历到一个字符,我们将其在数组中出现的次数进行减一操作,如果进行减一操作后,次数小于0了,那么我们结束操作,返回失败,如果直到我们遍历完ransomNote 字符串也没有失败,那么我们返回成功

3.写出代码

思路一的代码

c++ 复制代码
class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        unordered_map<char,int> ma1;
        unordered_map<char,int> ma2;
        int length1=ransomNote.length();
        int length2=magazine.length();
        for(int i=0;i<length1;i++){
            if(ma1.count(ransomNote[i])==0){
                ma1[ransomNote[i]]=1;
            }
            else{
                ma1[ransomNote[i]]++;
            }
        }

        for(int i=0;i<length2;i++){
            if(ma2.count(magazine[i])==0){
                ma2[magazine[i]]=1;
            }
            else{
                ma2[magazine[i]]++;
            }
        }

        for(pair<char,int> v:ma1){
            if(v.second>ma2[v.first]){
                return false;
            }
        }
        return true;
    }
};

思路二的代码

c++ 复制代码
class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        int arr[26]={0};
        for(char v:magazine){
            arr[v-'a']++;
        }
        for(char v:ransomNote){
            arr[v-'a']--;
            if(arr[v-'a']<0){
                return false;
            }
        }
        return true;
    }
};
相关推荐
小欣加油5 小时前
leetcode56 合并区间
c++·算法·leetcode·职场和发展
lqqjuly5 小时前
前沿算法深度解析(二)
人工智能·算法·机器学习
徐小夕6 小时前
万字长文!千万级文档 RAG 知识库系统落地实践
前端·算法·github
akunkuntaimei6 小时前
2026年高考数学各省真题及答案(完整版)
算法·高考
Hello:CodeWorld7 小时前
C 风格变参 vs C++ 变参模板:核心区别与选型指南
c语言·c++·算法
8Qi88 小时前
LeetCode 516:最长回文子序列
算法·leetcode·职场和发展·动态规划
youngerwang10 小时前
【从搬运工到协处理器:网卡芯片架构、算法、验证与边缘演进深度剖析】
网络·算法·架构·芯片
KaMeidebaby10 小时前
卡梅德生物技术快报|纯化重组蛋白实操详解
人工智能·python·tcp/ip·算法·机器学习
手写码匠11 小时前
从零实现 Prompt 工程引擎:结构化提示、自动优化与多轮自省体系
人工智能·深度学习·算法·aigc
无限码力11 小时前
阿里算法岗 0530笔试真题 - 多约束条件下的元素匹配统计
算法·阿里笔试真题·阿里机试真题·阿里算法岗笔试