leetcode第383题. 赎金信
给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。
(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。)
思路
和前面做过的242.有效的字母异或词
相似,区别在于242.有效的字母异位词相当于求 字符串a 和 字符串b 是否可以相互组成 ,而这道题目是求 字符串a能否组成字符串b,而不用管字符串b 能不能组成字符串a。
暴力解法
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
//暴力解法
for (int i = 0; i < magazine.size(); i++)
{
for (int j = 0; j < ransomNote.size(); j++)
{
if (magazine[i] == ransomNote[j])
{
// 在ransomNote中找到和magazine相同的字符
ransomNote.erase(ransomNote.begin() + j); //ransomNote删除这个字符
break; //因为magazine 中字符不能重复使用,所以break 选择magazine中的下一个字符继续匹配
}
}
}
//最后判断ransonNote 是否为空,为空说明能由magazine中字符组成
if (ransomNote.length() == 0)
{
return true;
}
return false;
}
};
哈希法
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
//哈希法
int record[26] = {0};
//注意为什么要用record记录magazine字符个数而不是ransomNote
//因为这道题目是求 字符串a能否组成字符串b,而不用管字符串b 能不能组成字符串a。
for (int i = 0; i < magazine.size(); i++)
{
//记录ransomNote 中各字符出现的个数
record[magazine[i] - 'a']++;
}
for (int j = 0; j < ransomNote.size(); j++)
{
record[ransomNote[j] - 'a']--;
if (record[ransomNote[j] - 'a'] < 0)
{
return false;
}
}
return true;
}
};
原文:哈希表:这道题我做过?