每日一题(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;
    }
};
相关推荐
这张生成的图像能检测吗20 分钟前
生成对抗网络(GANs)入门介绍指南:让AI学会“创造“的魔法(二)【深入版】
人工智能·pytorch·深度学习·神经网络·算法·生成对抗网络·计算机视觉
qq_5344525221 分钟前
【算法 day02】LeetCode 209.长度最小的子数组 | 59.螺旋矩阵II
java·算法·leetcode·职场和发展
dying_man23 分钟前
LeetCode--31.下一个排列
算法·leetcode
IC 见路不走29 分钟前
LeetCode 第75题:颜色分类
数据结构·算法·leetcode
Navigator_Z43 分钟前
LeetCode //C - 757. Set Intersection Size At Least Two
c语言·算法·leetcode
Blue.ztl2 小时前
DP刷题练习(二)
算法·cpp
青山是哪个青山2 小时前
位运,模拟,分治,BFS,栈和哈希表
算法·散列表·宽度优先
Zephyrtoria4 小时前
区间合并:区间合并问题
java·开发语言·数据结构·算法
柏箱6 小时前
容器里有10升油,现在只有两个分别能装3升和7升油的瓶子,需要将10 升油等分成2 个5 升油。程序输出分油次数最少的详细操作过程。
算法·bfs
Hello eveybody7 小时前
C++介绍整数二分与实数二分
开发语言·数据结构·c++·算法