Problem: 383. 赎金信
思路
该题可以通过hash表记录两个字符串中各字符出现次数,再比较各个键上杂志对应的值是否大于勒索信对应的值。为加速比较,可以采用同一个hash表来记录各个字符出现次数差。
解题方法
由于字符都是小写英文字符,所以可以定义一个长度为26的数组A记录每个字符出现的次数差(若样本都是简单的样本,以字典形式记录消耗空间更少)。先遍历杂志的每个字符,将a-z中各字符出现的次数记录在A的0-25位置上(即a对应位置0,b对应位置1);再遍历勒索信,若字符char出现一次,则A对应char位置上的次数减一,这里char代指a-z中的任一字符;若遍历勒索信时发现某一字符对应的次数小于0表示,杂志中该字符出现次数小于勒索信中,输出false, 否则输出true。
复杂度
时间复杂度:
O ( n ) O(n) O(n)
空间复杂度:
O ( 1 ) O(1) O(1)
Code
class Solution:
def canConstruct(self, ransomNote: str, magazine: str) -> bool:
d = [0]*26
for s in magazine:
i = ord(s) - ord('a')
d[i] += 1
for s in ransomNote:
i = ord(s) - ord('a')
d[i] -= 1
if d[i] <0:
return False
return True