LeetCode今天的每日一题又是难度为简单的题。。。。
LeetCode 383. 赎金信
不管那么多,先看题目!

题目

为了不在赎金信中暴露字迹,从杂志上搜索各个需要的字母,组成单词来表达意思。

给你一个赎金信 (ransomNote) 字符串和一个杂志(magazine)字符串,判断 ransomNote 能不能由 magazines 里面的字符构成。

如果可以构成,返回 true ;否则返回 false 。

magazine 中的每个字符只能在 ransomNote 中使用一次。

题解

很简单,使用一个哈希表统计 magazine 中的字符频率,然后循环一次 ransomNote 里的字符,如果哈希表中找不到这个字符,或是哈希表里这个字符的字频比 ransomNote 里的字频少,那么就 return false ,当循环结束,即证明ransomNote 能由 magazines 里面的字符构成, return true 。

直接上代码吧

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
if(ransomNote.size()>magazine.size())
return false;
map<char,int> chr1;
for(int i=0;i<magazine.size();i++)
chr1[magazine[i]]++;
for(int i=0;i<ransomNote.size();i++)
{
if(chr1.find(ransomNote[i])==chr1.end())
return false;
chr1[ransomNote[i]]--;
if(chr1[ransomNote[i]]<0)//如果这个字符字频被减到0以下,则证明 ransomNote 不能由 magazines 里面的字符构成。
return false;
}
return true;
}

此解法非唯一解,且不一定是最好的解法,如果您有更好的解法,欢迎在评论区中提出。