【简单】力扣算法题解析LeetCode383:赎金信

关注文末推广名片,即可免费获得本题测试源码

题目来源:LeetCode 383. 赎金信

问题抽象: 给定两个字符串 ransomNote(赎金信内容)和 magazine(杂志内容),要求判断 ransomNote 是否能由 magazine 中的字符 完全构造(即 magazine 包含 ransomNote 的所有字符且数量充足),满足以下核心需求:

  1. 构造规则定义

    • 字符使用需 严格匹配(区分大小写,但题目限定小写字母);
    • 每个字符只能使用一次(magazine 中字符不可重复使用);
    • 构造过程需保持字符顺序无关(仅需字符频次满足)。
  2. 计算约束

    • 时间复杂度 O(m+n)m, n 为字符串长度),空间复杂度 O(1)(固定长度数组);
    • 使用 频次统计数组(长度 26):
      • 遍历 magazine 统计各字符频次;
      • 遍历 ransomNote 递减频次,若任意字符频次 <0 则失败。
  3. 边界处理

    • ransomNote 为空 → 返回 true(无需字符);
    • magazine 为空且 ransomNote 非空 → 返回 false
    • magazine 长度 < ransomNote 长度 → 直接返回 false(字符总量不足);
    • 特殊用例:
      • ransomNote="a", magazine="b"false
      • ransomNote="aa", magazine="aab"true'a' 频次 2≥2);
      • ransomNote="abc", magazine="cba"true(顺序无关)。
  4. 字符范围

    • 输入字符串仅包含小写英文字母(无需处理大小写或特殊符号);
    • 频次数组索引:char - 'a'0-25)。

输入:字符串 ransomNote(长度 ≥0),字符串 magazine(长度 ≥0)。
输出:布尔值(true 表示可构造,false 表示不可构造)。


解题思路

题目要求判断字符串 ransomNote 是否能由字符串 magazine 中的字符组成(每个字符只能使用一次)。核心思路如下:

  1. 边界处理:若 ransomNote 长度大于 magazine,直接返回 false(字符数量不足)。
  2. 字符计数:使用长度 26 的数组(对应小写字母)统计 magazine 中各字符出现次数。
  3. 匹配验证:遍历 ransomNote,在计数数组中减掉对应字符的计数。若任何字符计数减后小于 0,说明 magazine 中该字符不足,返回 false
  4. 结果返回:若遍历完 ransomNote 所有字符均满足,则返回 true

时间复杂度:O(m + n)(m 和 n 分别为两字符串长度)。空间复杂度:O(1)(固定长度数组)


代码实现(Java版)🔥点击下载源码

class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        // 边界处理:赎金信比杂志长,必然无法构造
        if (ransomNote.length() > magazine.length()) {
            return false;
        }

        // 初始化26个小写字母的计数数组(索引:0->'a', 1->'b', ... 25->'z')
        int[] charCount = new int[26];
        
        // 统计杂志中每个字符的出现次数
        for (char c : magazine.toCharArray()) {
            charCount[c - 'a']++; // 'c' - 'a' 将字符映射到0-25的索引
        }
        
        // 检查赎金信中的每个字符
        for (char c : ransomNote.toCharArray()) {
            // 当前字符计数减1,若减后小于0说明杂志中该字符不足
            if (--charCount[c - 'a'] < 0) {
                return false;
            }
        }
        
        return true; // 所有字符均匹配成功
    }
}

代码说明

  1. 边界处理:第 4 行直接排除 ransomNote 长度更大的情况,避免无效计算。
  2. 计数数组
    • 第 8 行创建长度为 26 的数组 charCount(对应英文小写字母)。
    • 第 11-13 行遍历 magazine,通过 c - 'a' 将字符转为索引(如 'a'→0, 'b'→1),并增加计数。
  3. 字符匹配
    • 第 16-19 行遍历 ransomNote,对每个字符在计数数组中减 1。
    • 若减后值 < 0(第 18 行),说明 magazine 中该字符数量不足,立即返回 false
  4. 返回结果:第 21 行返回 true,表示 ransomNote 所有字符均能从 magazine 中匹配。

提交详情(执行用时、内存消耗)

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

达文汐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值