383.Ransom Note
Tags: [map]
Link: https://leetcode.com/problems/ransom-note/\#/description
Given an arbitrary ransom note string and another string containing letters from all the magazines, write a function that will return true if the ransom note can be constructed from the magazines ; otherwise, it will return false.
Each letter in the magazine string can only be used once in your ransom note.
Note:
You may assume that both strings contain only lowercase letters.
canConstruct("a", "b") -> false
canConstruct("aa", "ab") -> false
canConstruct("aa", "aab") -> true
Solution: Map
class Solution(object):
def canConstruct(self, ransomNote, magazine):
"""
:type ransomNote: str
:type magazine: str
:rtype: bool
"""
if not ransomNote:
return True
if not magazine:
return not ransomNote
c_map = {}
for c in magazine:
if c in c_map:
c_map[c] += 1
else:
c_map[c] = 1
for c in ransomNote:
if c not in c_map or c_map[c] == 0:
return False
c_map[c] -= 1
return True
Note:
- Time complexity = O(max(n, m)), n is the length of ransomNote, m is the length of the magazine.