刷刷刷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;
}
}
重难点

附:学习资料链接

posted @   blacksonny  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示