刷刷刷Day7| 383. 赎金信
383. 赎金信
LeetCode题目要求
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
示例1
输入:ransomNote = "a", magazine = "b" 输出:false
示例2
输入:ransomNote = "aa", magazine = "aab" 输出:true
解题思路
- 数组存储方式的解法
上代码
class Solution { public boolean canConstruct(String ransomNote, String magazine) { // 判断 ransomNote 的字符串能不能由 magazine 的字符串组成 // 由于字符都是小写字母,那么可以参考 字母异位 题通过数组方式实现 // 数组大小为 26,将字符转为 ASCII 码,即可对应数组的下标,将 magazine 的字符数量放入数组中, // 然后遍历 ransomNote,将对应字符数量 --。 // 最后判断数组中字符的数量判断,如果小于0 就说明不能构成 int[] charCount = new int[26]; for (int i = 0; i < magazine.length(); i++) { charCount[magazine.charAt(i) - 'a']++; } for (int i = 0; i < ransomNote.length(); i++) { charCount[ransomNote.charAt(i) - 'a']--; } for (int c : charCount) { if (c < 0) { return false; } } return true; } }
- map 存储方式的解法
上代码
class Solution { public boolean canConstruct(String ransomNote, String magazine) { Map<Character, Integer> map = new HashMap<>(); // 判断 ransomNote 的字符串能不能由 magazine 的字符串组成 // 可以借助 Map,首先将 magazine 的字符放入 map 中, // 然后遍历 ransomNote,判断是否在 map 中存在,如果存在就 -1, // 如果对应的字符不在 map 中存在或者数量 < 0, 说明无法构成 for (int i = 0; i < magazine.length(); i++) { map.merge(magazine.charAt(i), 1, Integer::sum); } for (int i = 0; i < ransomNote.length(); i++) { char c = ransomNote.charAt(i); if (!map.containsKey(c) || map.get(c) - 1 < 0) { return false; } map.put(c, map.get(c) - 1); } return true; } }
重难点
附:学习资料链接
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了