每日一题(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 分钟前
基于物理信息嵌入与多维度约束的深度学习地基承载力智能预测与可解释性评估算法(以模拟信号为例,Pytorch)
人工智能·pytorch·python·深度学习·算法·机器学习
古城小栈7 分钟前
Rust 丰富&好用的 格式化语法
前端·算法·rust
AuroraWanderll23 分钟前
类和对象(六)--友元、内部类与再次理解类和对象
c语言·数据结构·c++·算法·stl
leaves falling26 分钟前
c语言-给定两个数,求这两个数的最大公约数
数据结构·算法
SamtecChina202326 分钟前
Electronica现场演示 | 严苛环境下的56G互连
大数据·网络·人工智能·算法·计算机外设
Tim_1027 分钟前
【C++入门】05、复合类型-数组
开发语言·c++·算法
jikiecui27 分钟前
信奥崔老师:三目运算 (Ternary Operator)
数据结构·c++·算法
无限进步_28 分钟前
【C语言&数据结构】另一棵树的子树:递归思维的双重奏
c语言·开发语言·数据结构·c++·算法·github·visual studio
t1987512828 分钟前
同伦(Homotopy)算法求解非线性方程组
算法