LeetCode 383.赎金信(c++)

44 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情

前言

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

383.赎金信

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

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

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

示例 1:

输入: ransomNote = "a", magazine = "b"
输出: false

示例 2:

输入: ransomNote = "aa", magazine = "ab"
输出: false

示例 3:

输入: ransomNote = "aa", magazine = "aab"
输出: true

提示:

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

二、思路分析

理解完题目后,我就想用哈希表。于是考虑是用unorder_set还是unorder_map,题目并没有对顺序索引之类的有要求,所以决定用unorder_set。

用两个哈希表分别存储两个字符串中的字符,再遍历ransomNote中的每个字符,用count函数看储存着ransomNote哈希表中的字符数量是否小于等于另一个哈希表,不是的话则返回false。

但在提交结果的时候报了错,经过一番调试,发现了一个我忽略的细节,那就是unorder_set不允许有重复的元素出现,且在上一题中unorder_map也是这样。经过查阅资料,发现与unorder_set类似的unordered_multiset,两者的特性基本一致,但唯一不同的就是unordered_multiset容器允许值得重复。

所以我将两个哈希表的类型改为unordered_multiset,就成功的通过了。

三、AC代码

class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        unordered_multiset<char>p;
        unordered_multiset<char>q;
        for(char i:magazine){
            p.insert(i);
        }
        for(char i:ransomNote){
            q.insert(i);
        }
        for(char i:ransomNote){
            if(q.count(i)>p.count(i)){
                return false;
            }
        }
    return true;
    }
};

提交排名

image.png

四、总结

完全独立地写了出来,说明对哈希表已经有了一定的认识,很开心!