每日一题(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;
    }
};
相关推荐
JiNan.YouQuan.Soft13 分钟前
数值计算引擎:计算固体力学
人工智能·算法·机器学习
和裕24 分钟前
光伏储能定制加强型瓦楞纸箱:降低组件运输隐裂率与售后损耗的核心价值
大数据·运维·网络·人工智能·算法
Pointer Pursuit43 分钟前
C++11特性(二)
前端·c++·算法
lvwangshu1 小时前
数位 DP 进阶
算法·动态规划
她的男孩1 小时前
一个开源低代码框架的协作 SPI 是怎么设计的 ForgeAdmin 拆解 + 实战接入新平台
后端·算法·架构
OPEN-F1 小时前
C++20新特性精讲:概念、范围与三路比较
算法·c++20
@MMiL2 小时前
ST-link与J-link通俗易懂讲解
算法
RAOY的AI笔记2 小时前
GPT-6打破孪生素数猜想最新纪录:AI正在进入数学研究新时代?
人工智能·gpt·算法
Nil2082 小时前
leetcode 994腐烂的橘子
算法·leetcode·职场和发展
闻缺陷则喜何志丹2 小时前
【动态规划】P10726 [GESP202406 八级] 空间跳跃|普及+
c++·算法·动态规划·洛谷