持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情
383.赎金信
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ra…
为了不在赎金信中暴露字迹,从杂志上搜索各个需要的字母,组成单词来表达意思。
给你一个赎金信 (ransomNote) 字符串和一个杂志(magazine)字符串,判断 ransomNote 能不能由 magazines 里面的字符构成。
如果可以构成,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
示例 1:
输入:ransomNote = "a", magazine = "b" 输出:false
示例 2:
输入:ransomNote = "aa", magazine = "ab" 输出:false
示例 3:
输入:ransomNote = "aa", magazine = "aab" 输出:true
提示:
1 <= ransomNote.length, magazine.length <= 105 ransomNote 和 magazine 由小写英文字母组成
解法
-
该题目是一个字符比对问题,可以使用哈希表来存储参考字符是否出现以及出现的次数。再遍历对比字符串的时候与哈希字典中的元素进行比较:
-
出现在字典中:
- 出现次数大于1, 则减1继续遍历
- 次数为0, 则直接返回False
-
不出现在字典中,直接返回False
-
python
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
d = {}
for s in magazine:
if s not in d:
d[s] = 1
else:
d[s] += 1
for s in ransomNote:
if s not in d:
return False
else:
if d[s] == 0:
return False
d[s] -= 1
return True
- c++
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
map<char, int> dict;
int n = magazine.length();
for(int i=0; i<n; i++)
{
if(dict.count(magazine[i]))
{
dict[magazine[i]] += 1;
}
else
{
dict[magazine[i]] = 1;
}
}
int m = ransomNote.length();
for(int j=0; j<m; j++)
{
if(dict.count(ransomNote[j]))
{
if(dict[ransomNote[j]] == 0)
{
return false;
}
dict[ransomNote[j]] -= 1;
}
else
{
return false;
}
}
return true;
}
};
复杂度分析
- 时间复杂度:
- 遍历两个字符串所需要花费的时间
- 空间复杂度:
- 哈希字典需要的空间,S最多是26个字母