开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情
前言
从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
给你两个字符串: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;
}
};
提交排名
四、总结
完全独立地写了出来,说明对哈希表已经有了一定的认识,很开心!