Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
383. 赎金信 - 力扣(LeetCode) (leetcode-cn.com)
给你两个字符串: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 由小写英文字母组成
二、思路分析:
题目很简单,判断第一个字符串的字符集合是否是第二个字符串的字符集合的子集,直接思路是将第二个字符串遍历,用一个map存放每个字符出现的次数,然后再遍历第一个字符串,将对应字符出现次数-1,最后遍历map,如果有小于0的kv,那么就不满足。
三、AC 代码:
func canConstruct(ransomNote string, magazine string) bool {
l := [26]int{}
for _, v := range magazine {
l[v-97] += 1
}
for _, v := range ransomNote {
l[v-97] -= 1
if l[v-97] < 0 {
return false
}
}
return true
}
范文参考:
[微软招聘ing] [383. 赎金信] O(n) 统计每种字符有几个 - 赎金信 - 力扣(LeetCode) (leetcode-cn.com)