题目
给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串ransom能不能由第二个字符串magazines里面的字符构成。如果可以构成,返回 true ;否则返回 false。
(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。)
注意
你可以假设两个字符串均只含有小写字母。
canConstruct("a", "b") -> false
canConstruct("aa", "ab") -> false
canConstruct("aa", "aab") -> true
思路
这一题的关键也在于量,可以把杂志看做资源池,杂志能否拼凑出赎金信的关键在于杂志上是否有足够的字母可以填充到赎金信中。因此我们只需将赎金信和杂志各自拥有的字母及其出现次数映射到不同字典当中,然后比对这两个字典即可。
代码示例
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
dic1,dic2={},{}#初始化两个字典
for i in list(ransomNote):#遍历赎金信字符,将不同字母及其出现次数作为键值对追加到dic1当中
dic1[i]=dic1.get(i,0)+1
for i in list(magazine):#遍历杂志字符,将不同字母及其出现次数作为键值对追加到dic2当中
dic2[i]=dic2.get(i,0)+1
for k,v in dic1.items():#遍历dic1,k为键,v为值,键为字母,v为字母出现次数
if k in dic2:#判断赎金信中的字母是否出现在杂志上
if v<=dic2[k]:#判断杂志上该字母出现的次数是否大于或等于赎金信上该字母出现的次数
continue
else:#若不满足,返回False
return False
else:
return False
return True#遍历结束,说明满足条件,返回True