赎金信[简单]

优质博文:IT-BLOG-CN

一、题目

给你两个字符串:ransomNotemagazine,判断ransomNote能不能由magazine里面的字符构成。如果可以,返回true;否则返回falsemagazine中的每个字符只能在ransomNote中使用一次。

示例 1:

输入:ransomNote = "a", magazine = "b"

输出:false

示例 2:

输入:ransomNote = "aa", magazine = "ab"

输出:false

示例 3:

输入:ransomNote = "aa", magazine = "aab"

输出:true

1 <= ransomNote.length, magazine.length <= 105
ransomNotemagazine由小写英文字母组成

二、代码

【1】Map: 创建一个Map,key存放magazine字符,value存放count, 遍历ransomNotecount进行减小,如果小于0,说明不包含直接退出。

java 复制代码
class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        // 创建一个Map, key 存放 magazine 字符,value存放count, 遍历 ransomNote 对 count进行减小,如果小于0,说明不包含
        Map<Character, Integer> map = new HashMap();
        for (int i = 0; i < magazine.length(); i++) {
            map.put(magazine.charAt(i), map.getOrDefault(magazine.charAt(i), 0) + 1);
        }

        for (int i = 0; i < ransomNote.length(); i++) {
            int count = map.getOrDefault(ransomNote.charAt(i), 0);
            map.put(ransomNote.charAt(i), --count);
            if (count < 0) {
                return false;
            }
        }
        return true;
    }
}

时间复杂度: O(m+n)其中m表示ransomNote的长度,n表示magazine的长度。
空间复杂度: O(m)其中m表示ransomNote的长度。

【2】字符统计: 如果字符串magazine的长度小于字符串ransomNote的长度,则我们可以肯定magazine无法构成ransomNote,此时直接返回false。首先统计magazine中每个英文字母a的次数cnt[a],再遍历统计ransomNote中每个英文字母的次数,如果发现ransomNote中存在某个英文字母c的统计次数大于magazine中该字母统计次数cnt[c],则此时我们直接返回false

java 复制代码
class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        if (ransomNote.length() > magazine.length()) {
            return false;
        }
        // 创建一个26个字母长度的数组,下标表示字母,value表示个数
        int[] letter = new int[26];
        for (char c : magazine.toCharArray()) {
            letter[c - 'a']++;
        }
        for (char c : ransomNote.toCharArray()) {
            letter[c - 'a']--;
            if (letter[c - 'a'] < 0) {
                return false;
            }
        }
        return true;
    }
}

时间复杂度: O(m+n)其中m是字符串ransomNote的长度,n是字符串magazine的长度,我们只需要遍历两个字符一次即可。
空间复杂度: O(∣S∣)S是字符集,这道题中S为全部小写英语字母,因此∣S∣=26

相关推荐
颜酱37 分钟前
图的数据结构:从「多叉树」到存储与遍历
javascript·后端·算法
架构师沉默5 小时前
别又牛逼了!AI 写 Java 代码真的行吗?
java·后端·架构
zone77396 小时前
006:RAG 入门-面试官问你,RAG 为什么要切块?
后端·算法·面试
CoovallyAIHub9 小时前
OpenClaw 近 2000 个 Skills,为什么没有一个好用的视觉检测工具?
深度学习·算法·计算机视觉
CoovallyAIHub9 小时前
CVPR 2026 | 用一句话告诉 AI 分割什么——MedCLIPSeg 让医学图像分割不再需要海量标注
深度学习·算法·计算机视觉
CoovallyAIHub9 小时前
Claude Code 突然变成了 66 个专家?这个 5.8k Star 的开源项目,让我重新理解了什么叫"会用 AI"
深度学习·算法·计算机视觉
兆子龙9 小时前
前端哨兵模式(Sentinel Pattern):优雅实现无限滚动加载
前端·javascript·算法
后端AI实验室9 小时前
我把一个生产Bug的排查过程,交给AI处理——20分钟后我关掉了它
java·ai
凉年技术11 小时前
Java 实现企业微信扫码登录
java·企业微信
狂奔小菜鸡12 小时前
Day41 | Java中的锁分类
java·后端·java ee