【LeetCode】383. 赎金信

220 阅读2分钟

image.png

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第17天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

image.png

  • 题目示例

image.png

  • 题目解析

    • 本题给出两个字符串 ransomNotemagazine
    • ransomNotemagazine 都是由小写字母组成
    • ransomNotemagazine 长度都在0~10000

二、思路分析:

我们拿到本题,阅读本题和示例,心想这题也太简单了吧,先入为主的思路为:

  • 首先判断字符串ransomNote长度大于字符串magazine长度时,则直接返回False
  • 再来判断ransomNote字符是否在字符串magazine。如果在则返回True,则返回False

两个if判断写完后,提交AC代码,阿偶 49/126 "aab" "baa" 被NG了。

提交不成功,重新阅读题意,粗心大意的我忽略以下这句话:

  • 判断ransomNote 能不能由 magazine 里面的字符构成
  • 潜台词:字符串 magazine 字符串中字母可以组成 ransomNote 字符串
  • 字符串 magazine 中的字母只能用一次

重新理解了题意,使用模拟方法可以解答该题,思路如下:

  • 首先需要对字符串 ransomNote 字母进行去重
  • 使用for循环对 set(ransomNote) 中的字母 i 在magazine字母中判断,如果不存在则返回False
  • 使用count()函数对ransomNote.count(i) 大于 magazine.count(i) 时则返回False
  • 直到遍历完set(ransomNote),则返回True

根据以上思路,我们使用Python可以轻松实现出来,代码如下:

class Solution(object):
    def canConstruct(self, ransomNote, magazine):
        if len(ransomNote) > len(magazine):

            return False
        
        for i in set(ransomNote):

            if i not in magazine:
                
                return False
            
            if ransomNote.count(i) > magazine.count(i):

                return False  
        return True

除了使用字符串 count函数来计算出现字母的次数外,那还有其他方法吗?

  • 有的。可以借助列表来统计字符串的次数
  • 初始化一个长度为26的列表cnt
  • 使用for循环遍历字符串magazine中的字母i出现的次数cnt[i]
  • 然后再使用for循环遍历ransomNote中字母j进行计算,cnt[j]<0则返回False

image.png

class Solution(object):
    def canConstruct(self, ransomNote, magazine):
        """
        :type ransomNote: str
        :type magazine: str
        :rtype: bool
        """

        if len(ransomNote) > len(magazine):

            return False
        
        cnt = [0 for i in range(26)]

        for i in magazine:

            tmp = ord(i)-ord("a")
            cnt[tmp] = cnt[tmp] + 1

        for j in ransomNote:

            tmp = ord(j) - ord("a")

            cnt[tmp] = cnt[tmp] - 1

            if  cnt[tmp] < 0:

                return False
            
        return True

该方法,时间复杂度O(m+n)比方法一要慢一些。

三、总结:

本题主要考察的是magazine字符的统计,我们使用方法一提交,AC记录如下:

image.png

时间复杂度O(n) ,需要遍历ransomNote字符串 空间复杂度O(n)

以上是本期内容,欢迎大佬们点赞评论,下期见~~~