每日一题(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;
    }
};
相关推荐
你撅嘴真丑10 小时前
第九章-数字三角形
算法
uesowys10 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
ValhallaCoder10 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
董董灿是个攻城狮10 小时前
AI 视觉连载1:像素
算法
智驱力人工智能11 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
孞㐑¥11 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法
月挽清风11 小时前
代码随想录第十五天
数据结构·算法·leetcode
XX風12 小时前
8.1 PFH&&FPFH
图像处理·算法
NEXT0612 小时前
前端算法:从 O(n²) 到 O(n),列表转树的极致优化
前端·数据结构·算法
代码游侠13 小时前
学习笔记——设备树基础
linux·运维·开发语言·单片机·算法