LeetCode 面试经典 150_哈希表_赎金信(39_383_C++_简单)
LeetCode 面试经典 150_哈希表_赎金信(39_383_C++_简单)
- 题目描述:
- 输入输出样例:
- 题解:
- 解题思路:
- 思路一(哈希表):
- 代码实现
- 代码实现(思路一(哈希表)):
- 以思路一为例进行调试
题目描述:
给你两个字符串: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 由小写英文字母组成
题解:
解题思路:
思路一(哈希表):
1、思路如下:
- 统计ransomNote中每种字符出现的次数,再统计magazine中每种字符出现的次数。
- 需判断ransomNote中每种出现的字符是否满足条件。
- 若ransomNote中出现的字符不存在magazine中,或者magazine中该字符出现的次数小于ransomNote中出现的次数,则可直接返回false。
2、复杂度分析:
① 时间复杂度:O(m+n),其中 m 是字符串 ransomNote 的长度,n 是字符串 magazine 的长度,我们需要遍历两个字符串统计每种字符出现的次数,并进行比较。
② 空间复杂度:O(∣S∣),S 是字符集,这道题中 S 为全部小写英语字母,因此 ∣S∣=26。
代码实现
代码实现(思路一(哈希表)):
class Solution
{
public:// 判断是否可以从 magazine 中构造 ransomNotebool canConstruct(string ransomNote, string magazine) {if(ransomNote.size()>magazine.size()){return false;}// 使用 unordered_map 来统计 ransomNote 中每个字符的出现次数unordered_map<char, int> mp_r;// 使用 unordered_map 来统计 magazine 中每个字符的出现次数unordered_map<char, int> mp_m;// 遍历 ransomNote,统计每个字符的频次for (auto const c : ransomNote) {mp_r[c]++; // ransomNote 中字符 c 的出现次数加 1}// 遍历 magazine,统计每个字符的频次for (auto const c : magazine) {mp_m[c]++; // magazine 中字符 c 的出现次数加 1}// 遍历 ransomNote 中的字符频次 map (mp_r)for (auto const r : mp_r) {// 可以通过直接访问 mp_m[r.first] 来减少 count 的调用// 如果没有该字符,mp_m[r.first] 默认为 0// 如果 magazine 中该字符的数量小于 ransomNote 中的数量,则返回 falseif (mp_m[r.first] < r.second) {return false; // magazine 中该字符的数量不足}}// 如果所有字符的数量都足够,返回 true,表示 ransomNote 可以从 magazine 中构造return true;}
};
以思路一为例进行调试
#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;class Solution
{
public:// 判断是否可以从 magazine 中构造 ransomNotebool canConstruct(string ransomNote, string magazine) {if(ransomNote.size()>magazine.size()){return false;}// 使用 unordered_map 来统计 ransomNote 中每个字符的出现次数unordered_map<char, int> mp_r;// 使用 unordered_map 来统计 magazine 中每个字符的出现次数unordered_map<char, int> mp_m;// 遍历 ransomNote,统计每个字符的频次for (auto const c : ransomNote) {mp_r[c]++; // ransomNote 中字符 c 的出现次数加 1}// 遍历 magazine,统计每个字符的频次for (auto const c : magazine) {mp_m[c]++; // magazine 中字符 c 的出现次数加 1}// 遍历 ransomNote 中的字符频次 map (mp_r)for (auto const r : mp_r) {// 可以通过直接访问 mp_m[r.first] 来减少 count 的调用// 如果没有该字符,mp_m[r.first] 默认为 0// 如果 magazine 中该字符的数量小于 ransomNote 中的数量,则返回 falseif (mp_m[r.first] < r.second) {return false; // magazine 中该字符的数量不足}}// 如果所有字符的数量都足够,返回 true,表示 ransomNote 可以从 magazine 中构造return true;}
};int main(int argc, char const *argv[])
{string ransomNote="aa";string magazine ="aab";Solution s;if(s.canConstruct(ransomNote,magazine)){cout<<"true";}else{cout<<"false";}return 0;
}
LeetCode 面试经典 150_哈希表_赎金信(39_383)原题链接
欢迎大家和我沟通交流(✿◠‿◠)