刷刷刷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;
}
}
重难点
附:学习资料链接