每日一题(LeetCode)—-哈希表–赎金信
1.题目(383. 赎金信)
-
给你两个字符串:
ransomNote
和magazine
,判断ransomNote
能不能由magazine
里面的字符构成。magazine
中的每个字符只能在ransomNote
中使用一次。示例 1:
输入:ransomNote = "a", magazine = "b" 输出:false
示例 2:
输入:ransomNote = "aa", magazine = "ab" 输出:false
示例 3:
输入:ransomNote = "aa", magazine = "aab" 输出:true
提示:
2.解题思路
思路一:哈希法
1.创建两个哈希表(这里用unordered_map),两个哈希表的键值都是遍历到的字符,实值是当前遍历到的字符出现的次数
2.遍历两个字符串,每遍历到一个字符,就看当前字符是否在对应的哈希表中出现过,没出现过我们就将当前元素和它出现的次数(此时为一)作为一个元素存入对应的哈希表中,出现过我们就将它的出现次数进行加一操作
3.遍历其中一个哈希表,每遍历到哈希表中的一个元素,我们就取出这个元素中的实值(也就是在第一个字符串中当前字符出现的次数),然后以当前哈希表中的键值(在第一个字符串中出现的字符)作为另一个哈希表中的键值(在第二个字符串中出现的字符)取出另一个的实值(也就是在第二个字符串中当前字符出现的次数),将两个实值进行比较,如果第一个实值比第二个实值大,那么返回失败,否则就继续进行遍历,如果遍历完第一个哈希表之后还没有返回失败,那么返回成功
思路二:字符统计法(用数组来实现的)
1.创建一个26个长度的数组用来记录每个字符出现的次数(因为这里题目说了两个字符串只由小写英文字母构成,所以我们这里创建的是26个长度的数组)
2.我们先遍历一遍magazine字符串,将magazine字符串中各个字符出现的次数存到数组中
3.我们再遍历一遍ransomNote 字符串,每遍历到一个字符,我们将其在数组中出现的次数进行减一操作,如果进行减一操作后,次数小于0了,那么我们结束操作,返回失败,如果直到我们遍历完ransomNote 字符串也没有失败,那么我们返回成功
3.写出代码
思路一的代码
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;
}
};
思路二的代码
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;
}
};
原文地址:https://blog.csdn.net/m0_73483024/article/details/134742199
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_26808.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!