力扣383. 赎金信

125 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

力扣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) 链接:leetcode-cn.com/problems/ra… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

  1. 这道题考察了什么思想?你的思路是什么?

    看到这道题目,我的第一想法是给两个字符串计数,得到两组数据,然后比较这两组数据即可。

  2. 做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?

    使用Python时,不知道collections.Counter() 之间可以相减。实现起来有点麻烦。这道题目用Python就十分简单了。

  3. 有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?

    image-20220322133446946

    看了很多大佬的解法,都大同小异,不过这种解法也是我比较喜欢。

三、AC 代码:

Python:

 class Solution(object):
     def canConstruct(self, ransomNote, magazine):
         """
         :type ransomNote: str
         :type magazine: str
         :rtype: bool
         """
         return not collections.Counter(ransomNote) - collections.Counter(magazine)

image-20220322133034698

image-20220322133045777

Golang:

func canConstruct(ransomNote, magazine string) bool {
    cnt := [26]int{}
    for _, ch := range magazine {
        cnt[ch-'a']++
    }
    for _, ch := range ransomNote {
        cnt[ch-'a']--
        if cnt[ch-'a'] < 0 {
            return false
        }
    }
    return true
}

image-20220322133727320

image-20220322133744921

四、总结:

朴实无华的一道题目,基本功扎实都能做出来。