记录新手小白的做题过程。
题目:
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
思路:大概的思路是,采用unordered_map,分别遍历两个字符串, 将需要的字符记为key,出现的次数记为value,然后取ransomNote的key指向的value减去magazine相对应的value,若ransomNote的value大于0 ,则说明magazine的不满足要求。
代码如下:
public:
bool canConstruct(string ransomNote, string magazine) {
unordered_map<char,int> hash1,hash2;
for(char a:ransomNote){//先记录第一个字符串
hash1[a]++;
}
for(char b:magazine){//遍历第二个字符串
hash2[b]++;
}
for(char a='a';a<='z';a++){//比较对应字母的个数
if(hash1[a]-hash2[a]>0){
return false;
}
}
return true;
}
};
哇哦,感觉还不错。
两个哈希表占的内存有点多,以空间换时间。
官方代码:
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
if (ransomNote.size() > magazine.size()) {
return false;
}
vector<int> cnt(26);
for (auto & c : magazine) {
cnt[c - 'a']++;
}
for (auto & c : ransomNote) {
cnt[c - 'a']--;
if (cnt[c - 'a'] < 0) {
return false;
}
}
return true;
}
};
思想是相似的,不过他增加了一个先比较长度的算法,再遍历两个取差值。
然后他是用vector来储存的,直接开辟26个内存来放各个字母出现的次数。然后相减,若出现负数则说明没有满足需求。
收获:
1.遍历字符串的新方法 auto & c:ransomNote
2.哈希表的遍历:auto & ch:hash1;
因为在写遍历hash1时不知道该怎么遍历,所以我是直接从字符a到z循环的。
好了,下一题下一题!