题目
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ransom-note
为了不在赎金信中暴露字迹,从杂志上搜索各个需要的字母,组成单词来表达意思。
给你一个赎金信 (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扫描二维码关注公众号,回复: 13595320 查看本文章
提示:
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;
}
};
复杂度分析
- 时间复杂度:
- O ( N + M ) O(N+M) O(N+M) 遍历两个字符串所需要花费的时间
- 空间复杂度:
- O ( S ) O(S) O(S) 哈希字典需要的空间,S最多是26个字母