这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战。
题目描述:
383. 赎金信 - 力扣(LeetCode) (leetcode-cn.com)
为了不在赎金信中暴露字迹,从杂志上搜索各个需要的字母,组成单词来表达意思。
给你一个赎金信 (ransomNote
) 字符串和一个杂志(magazine
)字符串,判断 ransomNote
能不能由 magazines
里面的字符构成。
如果可以构成,返回 true
;否则返回 false
。
magazine
中的每个字符只能在 ransomNote
中使用一次。
示例一
输入: ransomNote = "a", magazine = "b"
输出: false
复制代码
示例二
输入: ransomNote = "aa", magazine = "ab"
输出: false
复制代码
示例三
输入: ransomNote = "aa", magazine = "aab"
输出: true
复制代码
提示:
1 <= ransomNote.length, magazine.length <= 10^5
ransomNote
和magazine
由小写英文字母组成
思路分析
哈希表
别看题目说的花里胡哨的,其实就是要看 赎金信
中的字母在杂志中能不能都找出来。数学上来说就是子集的概念而已。
明白了题意,我们就很容易想到哈希表的解法了,我们可以利用hash表记录 杂志
中每个字母的个数,也就是我们有的字母,然后遍历 赎金信
的时候,每找到一个就减掉个数,如果出现 负数
, 说明我们的 杂志
已经不能满足我们的需求了。
AC代码
class Solution {
fun canConstruct(ransomNote: String, magazine: String): Boolean {
val bucket = IntArray(26)
for (c in magazine) {
bucket[c - 'a']++
}
for (c in ransomNote) {
if (bucket[c - 'a'] <= 0) {
return false
}
bucket[c - 'a']--
}
return true
}
}
复制代码
总结
每日简单一题。
参考
小白简单思路 - 赎金信 - 力扣(LeetCode) (leetcode-cn.com)
python3 Counter永远的神,使用“与”操作,极少代码解决问题 - 赎金信 - 力扣(LeetCode) (leetcode-cn.com)