题目
给你两个字符串: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
提示
class Solution { public boolean canConstruct(String ransomNote, String magazine) { HashMap<Character,Integer> magazineMap = new HashMap<>(); for(char c : magazine.toCharArray()){ magazineMap.put(c,magazineMap.getOrDefault(c,0)+1); } for(char c : ransomNote.toCharArray()){ if(!magazineMap.containsKey(c) || magazineMap.get(c)==0){ return false; } magazineMap.put(c,magazineMap.get(c) - 1); } return true; } }
详细解读
这段代码是一个解决 "赎金信" 问题的 Java 方法。下面是对这段代码的详细解读:
1.canConstruct
方法:
- 这是一个公共方法,返回一个布尔值,指示是否可以从 magazine 中的字符构建出 ransomNote。
- 参数
ransomNote
表示赎金信,参数magazine
表示杂志内容。
2.创建 HashMap:
- 在方法的开头,创建了一个 HashMap 对象
magazineMap
,用于存储 magazine 中每个字符的出现次数。
3.遍历 magazine 字符串:
- 使用
for
循环遍历 magazine 字符串的每个字符。 - 对于每个字符,使用 magazineMap.put(c, magazineMap.getOrDefault(c, 0) + 1); 将其添加到 magazineMap 中,如果该字符已经存在于 magazineMap 中,则将其出现次数加一;如果不存在,则将其添加到 magazineMap 中,并将出现次数设置为 1。
4.遍历 ransomNote 字符串:
- 使用 for 循环遍历 ransomNote 字符串的每个字符。
- 对于每个字符,首先检查它是否存在于 magazineMap 中,如果不存在或者出现次数已经为 0,则说明无法从 magazine 中构建出 ransomNote,直接返回 false。
- 如果存在,则将其出现次数减一,表示已经使用了该字符。
5.返回结果:
- 如果成功遍历完 ransomNote 字符串中的所有字符,说明可以从 magazine 中构建出 ransomNote,返回 true。
这段代码的核心思想是通过 HashMap 存储 magazine 中每个字符的出现次数,然后遍历 ransomNote 字符串,逐个检查其中的字符是否在 magazine 中出现,并且出现次数是否足够。