1:题目描述
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
2:解题思路
根据题意需要查找数组ransomNote中的元素是否由数组magazine中的元素构成,符合查找一个元素是否在一个数组中,所以我们使用哈希结构-数组。
因为数组ransomNote和数组magazine都是由小写英文字母组成,我们可以定义一个长度为26,初始值全为0的数组res(通过遍历到的元素的ASCII码减去a的ASCII码值,来作为这个元素在res中的下标映射关系),来统计数组ransomNote中元素出现的次数,再减去数组magazine中元素出现的次数。
如果数组res中有元素大于0了,说明数组ransomNote中某个元素比数组magazine中多或不存在于数组magazine中;
如果数组res中的元素全为0,说明数组ransomNote和数组magazine中的元素和出现的次数一致;如果数组res中有元素小于0,说明数组magazine中有的元素,数组ransomNote中没有。
代码展示:
class Solution:
def canConstruct(self, ransomNote, magazine):
res = [0] * 26
for i in range(len(ransomNote)):
# 使用当前元素的ASCII码减去a的ASCII码,作为当前元素在数组res中的下标的映射关系
res[ord(ransomNote[i]) - ord("a")] += 1
for j in range(len(magazine)):
res[ord(magazine[j]) - ord("a")] -= 1
for m in range(len(res)):
if res[m] > 0:
# 有元素大于0,说明数组ransomNote中出现的元素在数组magazine中没出现或者次数不够
return False
return True