赎金信
- 题目
- 思路一
- 方法一:哈希表
- 思路二
- 方法二 数组
题目
思路一
我们使用哈希表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;}
};