338.赎金信

力扣题目链接

​ 给你两个字符串:ransomNotemagazine,判断 ransomNote 能不能由 magazine 里面的字符构成。如果可以,返回 true ;否则返回 falsemagazine 中的每个字符只能在 ransomNote 中使用一次。

​ 示例 1:

1
2
输入:ransomNote = "a", magazine = "b"
输出:false

​ 示例 2:

1
2
输入:ransomNote = "aa", magazine = "ab"
输出:false

​ 示例 3:

1
2
输入:ransomNote = "aa", magazine = "aab"
输出:true

提示:

1 <= ransomNote.length, magazine.length <= 105 ransomNotemagazine 由小写英文字母组成

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/ransom-note

思路

​ 统计magazine中的字母次数,再用ransomNote中的字母减去,如果字母不够用则无法构成。

实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
//判断字符串长度, ransomNote如果长度大于magazine, 一定不可以
if(ransomNote.size() > magazine.size()) return false;
//定义一个数组储存magazine a - z 26个字母的个数, 因为只有小写字母所以只有26个
int count[26] = {};
//由于magazine是用来组成ransomNote的,所以储存其字母的个数,用magazine中的减去,如果小于0,说明字母不够无法组成
for(char temp : magazine)
count[temp - 'a']++;
//遍历ransomNote
for(char temp : ransomNote)
{
count[temp - 'a']--;
//字母 temp - 'a' 不够
if(count[temp - 'a'] < 0)
return false;
}
return true;
}
};
  • 时间复杂度:,其中 是字符串 的长度, 是字符串 的长度。
  • 空间复杂度:,26个字母。

本文封面图片由yinet gomezPixabay上发布