跳至主要內容

0383. 赎金信

ITCharge大约 2 分钟

0383. 赎金信open in new window

  • 标签:哈希表、字符串、计数
  • 难度:简单

题目链接

题目大意

描述:为了不在赎金信中暴露字迹,从杂志上搜索各个需要的字母,组成单词来表达意思。

给定一个赎金信字符串 ransomNoteransomNote 和一个杂志字符串 magazinemagazine

要求:判断 ransomNoteransomNote 能不能由 magazinesmagazines 里面的字符构成。如果可以构成,返回 True;否则返回 False

说明

  • magazinemagazine 中的每个字符只能在 ransomNoteransomNote 中使用一次。
  • 1ransomNote.length,magazine.length1051 \le ransomNote.length, magazine.length \le 10^5
  • ransomNoteransomNotemagazinemagazine 由小写英文字母组成。

示例

  • 示例 1:
输入:ransomNote = "a", magazine = "b"
输出:False
  • 示例 2:
输入:ransomNote = "aa", magazine = "ab"
输出:False

解题思路

思路 1:哈希表

暴力做法是双重循环遍历字符串 ransomNoteransomNotemagazinesmagazines。我们可以用哈希表来减少算法的时间复杂度。具体做法如下:

  • 先用哈希表存储 magazinesmagazines 中各个字符的个数(哈希表可用字典或数组实现)。
  • 再遍历字符串 ransomNoteransomNote 中每个字符,对于每个字符:
    • 如果在哈希表中个数为 00,直接返回 False
    • 如果在哈希表中个数不为 00,将其个数减 11
  • 遍历到最后,则说明 ransomNoteransomNote 能由 magazinesmagazines 里面的字符构成。返回 True

思路 1:代码

class Solution:
    def canConstruct(self, ransomNote: str, magazine: str) -> bool:
        magazine_counts = [0 for _ in range(26)]

        for ch in magazine:
            num = ord(ch) - ord('a')
            magazine_counts[num] += 1

        for ch in ransomNote:
            num = ord(ch) - ord('a')
            if magazine_counts[num] == 0:
                return False
            else:
                magazine_counts[num] -= 1

        return True

思路 1:复杂度分析

  • 时间复杂度O(m+n)O(m + n),其中 mm 是字符串 ransomNoteransomNote 的长度,nn 是字符串 magazinesmagazines 的长度。
  • 空间复杂度O(S)O(|S|),其中 SS 是字符集,本题中 S=26|S| = 26