赎金信
- 题目
- 思路一
- 方法一:哈希表
- 思路二
- 方法二 数组
题目
思路一
我们使用哈希表map的思路,A能不能由B组成,说明B包含的元素个数要大于等于A。
所以我们先利用map的key和value分别对magazine中的出现的字符以及出现的次数存储起来。
然后我们去ransomNote中找对应的字符,每找到一次且value值大于零,就让value值减一。
如果没找到或者value值小于零,直接返回false。
方法一:哈希表
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
unordered_map<char, int> map;
for (char c : magazine) {
map[c]++;
}
for (char d : ransomNote) {
if (map.find(d) != map.end() && map.find(d)->second > 0) {
map[d]--;
} else {
return false;
}
}
return true;
}
};
思路二
题目明确说了,只包含小写字母,所以可以直接用数组来完成,不需要利用map消耗过多的空间。
如果ransomNote的长度大于magazine,很明显ransomNote不能由magazine组成,直接返回false。
然后在magazine中对每个字符出现的次数累加,在ransomNote对所有的字符累减。
最后判断数组中是否存在小于零的值,如果有,则返回false,否则为true。
方法二 数组
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int record[26] = {0};
// 判断数组长度是否合理
if (ransomNote.size() > magazine.size()) return false;
for (int i = 0; i < magazine.size(); i++) {
record[magazine[i] - 'a']++;
}
for (int i = 0; i < ransomNote.size(); i++) {
record[ransomNote[i] - 'a']--;
}
for (int i = 0; i < 26; i++) {
if (record[i] < 0) return false;
}
return true;
}
};