題目敘述
題目敘述到我們有兩個字串 ransomNote
和 magazine
假設 ransomNote
可以透過 magazine
則回傳 True
否則我們回傳 False
解題思路
最簡單的方式莫過於我們使用兩個字典,一個 d1
和一個 d2
分別計算兩者字串出現過的次數
假設 ransomNote
的 d1
可以再每一個字元出現次數皆大於 magazine
的 d2
我們就回傳 True
否則我們回傳 False
當然,我們也可以只需要一個字典,怎麼做呢?
其實我們只需要 d1
然後我們用 d1
扣除遍歷 magazine
字元出現的次數,假設我們遍歷不到,就代表 ransomNote
無法構成 magazine
程式碼實作
class Solution(object):
def canConstruct(self, ransomNote, magazine):
"""
:type ransomNote: str
:type magazine: str
:rtype: bool
"""
d = defaultdict(int)
for i in magazine:
d[i] += 1
for i in ransomNote:
if i in d:
d[i] -= 1
if d[i] == 0:
del d[i]
else:
return False
return True
時間與空間複雜度分析
時間複雜度(Time Complexity):$O(len(ransomNote) + len(magazine))$
空間複雜度(Space Complexity):$O(len(ransomNote))$
ransomNote
的空間。