力扣383. 赎金信
一、题目描述:
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
示例 1:
输入:ransomNote = "a", magazine = "b"输出:false示例 2:
输入:ransomNote = "aa", magazine = "ab"输出:false示例 3:
输入:ransomNote = "aa", magazine = "aab"输出:true
提示:
1 <= ransomNote.length, magazine.length <= 10^5
ransomNote 和 magazine 由小写英文字母组成
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/ransom-note著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
这道题考察了什么思想?你的思路是什么?
- 看到这道题目,我的第一想法是给两个字符串计数,得到两组数据,然后比较这两组数据即可。
做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?
- 使用Python时,不知道collections.Counter() 之间可以相减。实现起来有点麻烦。这道题目用Python就十分简单了。
有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?
看了很多大佬的解法,都大同小异,不过这种解法也是我比较喜欢。
三、AC 代码:
Python:
classSolution(object):
defcanConstruct(self, ransomNote, magazine):
"""
:type ransomNote: str
:type magazine: str
:rtype: bool
"""
returnnotcollections.Counter(ransomNote) -collections.Counter(magazine)
Golang:
funccanConstruct(ransomNote, magazinestring) bool {
iflen(ransomNote) >len(magazine) {
returnfalse
}
cnt := [26]int{}
for_, ch :=rangemagazine {
cnt[ch-'a']++
}
for_, ch :=rangeransomNote {
cnt[ch-'a']--
ifcnt[ch-'a'] <0 {
returnfalse
}
}
returntrue
}
四、总结:
朴实无华的一道题目,基本功扎实都能做出来。