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 <= 105
ransomNote 和 magazine 由小写英文字母组成

思路

相当于有效的字母异位词那道题,而这道题目是求字符串a能否组成字符串b,而不用管字符串b能不能组成字符串a。

两种解法:
一是利用字典求解
二是根据题目的提示全为小写字母可以利用数组求解(数组记录mag字符的个数,再减去ran字符的个数,最后统计数组如果有小于0的字符即返回False,否则返回True)

代码

class Solution:
    def canConstruct(self, ransomNote: str, magazine: str) -> bool:
        # # 哈希--字典
        # # 统计magazine中字母的个数
        # dict_mag = {}
        # for i in magazine:
        #     if i not in dict_mag:
        #         dict_mag[i] = 1
        #     else:
        #         dict_mag[i] += 1
        # # 统计ransonNote中字母的个数
        # dict_ran = {}
        # for i in ransomNote:
        #     if i not in dict_ran:
        #         dict_ran[i] = 1
        #     else:
        #         dict_ran[i] += 1

        # for k, v in dict_ran.items():
        #     if k in dict_mag and dict_ran[k] <= dict_mag[k]:
        #         continue
        #     else:
        #         return False
        # return True

        # # 哈希数组--提示中提示了全是小写字母了
        record = [0] * 26
        for i in magazine:
            record[ord(i) - ord("a")] += 1
        for i in ransomNote:
            record[ord(i)- ord("a")] -= 1

        for i in record:
            if i < 0:
                return False
        return True
posted @ 2022-09-03 10:41  时光如你般美好  阅读(13)  评论(0编辑  收藏  举报