一、题目
给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串ransom能不能由第二个字符串magazines里面的字符构成。如果可以构成,返回 true ;否则返回 false。
(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。)
注意:
你可以假设两个字符串均只含有小写字母。
canConstruct("a", "b") -> false canConstruct("aa", "ab") -> false canConstruct("aa", "aab") -> true
二、题解思路
- 题解思路:首先所有成立的条件是在magazine字符串长度大于等于ransomNote进行的:将ransomNote和magazine中的单个字符作为key,字符出现的次数作为value,分别存入各自的map中,然后遍历ransomNote的map中的每个字符和出现次数,去magazine中看是否存在这样的字符,如果存在其次数是否大于ransomNote中对应字符的次数。
三、代码实现
- C++代码实现
class Solution {
public:
bool canConstruct(string ransomNote, string magazine)
{
int size_1 = ransomNote.size();
int size_2 = magazine.size();
map<char,int> nums1; //存取ransomNote中的字符及这个字符出现的次数
map<char,int> nums2; //存取magazine中的字符及这个字符出现的次数
if(size_1 > size_2)
return false;
else
{
for(int i = 0;i<size_1;i++)
nums1[ransomNote[i]]++; //map使用索引形式存取kay-value
for(int i = 0;i<size_2;i++)
nums2[magazine[i]]++;
for(auto c:nums1) //遍历nums1对应的key-value
{
if((nums2.find(c.first) == nums2.end()) || (nums2[c.first] < c.second))
return false;
}
return true;
}
}
};