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

LeetCode 383 - 赎金信 这道题其实是一个很“生活化”的问题:给定两段文字,判断第一段文字(赎金信)能不能完全用第二段文字(杂志)里的字母拼出来。换句话说,你能不能从杂志里“剪字母”,凑成一封赎金信。 在程序实现上,本质就是统计字符的数量,看 magazine 里的字母是否够 ransomNote 用。本文会一步步带你分析题目,给出 Swift 的可运行 Demo,并结合一些生活场景来帮助理解。 阅读详情

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

题目来源: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 中匹配。

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

在这里插入图片描述

Conda安装cuda指定版本遇到的一个大坑,导致pytorch无法使用cuda且nvcc -V显示错误的cuda版本 24年3月份的时候用conda install nvidia/label/cuda-11.x.x::cuda还挺正常的,能直接安装11.x.x版本的cuda,我还安利给同学用。但现在5月份不知道为什么这些命令都只会安装最新的cuda12.4,不知道是我哪里设置有问题还是官网的安装目录里的环境配置换了?我在三台不同的服务器上都尝试了安装不同版本的cuda,但最后安装下来的都是12.4版本。 阅读详情

相关推荐

实战避坑:在STM32上移植AUTOSAR BSW时,MCAL、ECU抽象层和服务层配置有哪些常见‘雷区’?

本文深入解析在STM32上移植AUTOSAR BSW时MCAL、ECU抽象层和服务层配置的常见陷阱,包括时钟树配置差异、GPIO电气特性问题、定时器资源冲突等实战经验。特别针对AUTOSAR架构在资源受限MCU上的特殊挑战,提供具体解决方案和优化策略,帮助开发者规避移植过程中的典型错误。

weixin_30258901的博客 561

3-哈希表-61-赎金信-LeetCode383

3-哈希表-61-赎金信-LeetCode383

weixin_43873121的博客 1177

SPSS因子分析实战:从数据清洗到结果解读的完整流程

本文提供了一份详尽的SPSS因子分析实战指南,涵盖从数据清洗、适用性检验(KMO与巴特利特检验)、公因子提取、因子旋转到结果解读与报告撰写的完整流程。通过具体案例,手把手教你如何利用SPSS进行探索性因子分析,实现数据降维并提炼核心公共因子,适用于市场研究、心理学等多变量数据分析场景。

weixin_29055699的博客 329

day28【LeetCode力扣】383.赎金信

基于本题的情况下,使用map的空间消耗要比数组大一些,因为map要维护红黑树或者哈希表,而且还要做哈希函数,是比较费时的!这题和day22的242.有效的字母异位词很类似,只不过这题是一串字母能组成另一串,不用管对方。ok了,就到这里叭~~~

canGfly的博客 811

海康VisionMaster表面缺陷滤波实战:从参数调优到工业检测避坑指南

本文深入探讨海康VisionMaster表面缺陷滤波技术在工业检测中的应用,从参数调优到ROI绘制与Blob分析的协同策略,提供金属外壳、锂电池铝壳等复杂表面的缺陷检测实战指南。通过多级滤波架构和动态ROI生成法,显著提升检出率至98.7%,误检率低于0.5%,为工业质检提供智能化解决方案。

ujm5678901的博客 323

maxwell与steady state thermal 通过workbench耦合仿真

文章目录maxwellsteady state thermal maxwell 1加入maxwell并打开 2导入模型 3选择求解器类型:涡流求解器eddy current 4修改模型名字不能带_等特殊符号 5为模型赋材料 6设立3D边界,各边电流进出方向为0其余方向300 7设置激励条件,可设置电流大小,相位,方向 8设置集肤深度,选取中间铜导体的体然后设置,如何设置看帮助文档 9求解设置 迭代步数 收敛精度 交流电频率 10验证条件满足计算 11求解 发现无法求解,删除ai

roymustang的博客 9198

LeetCode:383. 赎金信

LeetCode:383. 赎金信 题目描述:给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以,返回 true ;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。

Super algorithm 的博客,技术爱好者。 1230

36、R语言中的回归模型与机器学习算法

本文介绍了R语言中多种回归模型和机器学习算法,包括Cox回归模型、数据平滑方法(如样条函数、多项式曲面拟合和核平滑)以及回归树模型等。重点讲解了这些方法的实现函数、参数说明以及实际应用示例,如使用`coxph`进行生存分析、使用`spline`和`smooth.spline`进行数据平滑处理、使用`loess`和`locpoly`进行非参数回归分析,以及使用`rpart`构建和可视化回归树。此外,还涉及了模型评估与优化策略,如数据拆分、交叉验证和树的修剪。通过这些方法,可以更好地处理复杂数据集并提升模型性能

yhn456789的博客 121

Java实现 LeetCode 383 赎金信

383. 赎金信 给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串ransom能不能由第二个字符串magazines里面的字符构成。如果可以构成,返回 true ;否则返回 false。 (题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。) 注意: 你可以假设两个字符串均只含有小写字母。 canConstruct(“a...

南 墙 1万+

【RK3399 Ubuntu】基于rk3399的lxde的lubuntu桌面移植适配记录之第二步:最基本Ubuntu根文件系统的相关常用工具完善

文章目录1.使能系统网络管理服务1.1 安装驱动modules管理工具1.2 使能网络服务2.终端自动补全命令功能3.安装ssh服务4.安装系统信息查看工具5.安装resize工具6.安装lrzsz工具7.使能rc.local服务7.1 修改服务Install块7.2 使能rc.local.service服务7.3 添加执行脚本且赋予执行权限 续接上文,本文主要完善前面已经制作好的rootfs 1.使能系统网络管理服务 1.1 安装驱动modules管理工具 apt-get install kmod 1.

wang 恒 的博客 1385

后台管理系统-7-vue3之引入配置文件baseURL

mock=false,本地模拟。mock=true,线上模拟。baseURL+url=实际请求的URL。get请求param参数,post请求data参数。

qq_20466211的博客 207

力扣 383. 赎金信

力扣 383. 赎金信 本文仅仅简单讲解了《赎金信》这一题目,是Python中collections.Counter()函数的一次具体应用;

m0_51787573的博客 1033

YOLO格式数据集划分

YOLO格式的数据集划分 标题标签格式txt import os import cv2 import random from PIL import Image # os.makedirs('labels_train') # os.makedirs('labels_val') img_train_path ='./img_train/' #图片训练集保存路径 img_val_path = './img_val/' #图片验证集保存路径 labels_train_path = './labels_t

weixin_51154380的博客 3306

【LeetCode刷题日记】383 赎金信

【摘要】本文讲解了LeetCode 383题"赎金信"的哈希表解法。题目要求判断ransomNote字符串能否由magazine字符串中的字符构成(每个字符只能用一次)。解题思路:1. 使用长度为26的数组记录字符出现次数;2. 先遍历magazine统计字符频次;3. 再遍历ransomNote减少对应字符计数;4. 若任意字符计数为负则返回false。与242题"有效字母异位词"的区别在于本题是单向判断。关键点包括:字符不可重用、仅含小写字母、使用toCharAr

任岁月风干理想再也找不回真的我 708

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

leetcode 算法题383 (简单093) 赎金信

leetcode 算法题383 (简单093) 赎金信 题目介绍 给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串, 判断第一个字符串ransom能不能由第二个字符串magazines里面的字符构成。 如果可以构成,返回 true ;否则返回 false。 (题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。) 注意 你可以假...

FYuu95100的博客 253

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【算法】【哈希表、数组、C语言、C++】力扣383. 赎金信

本题较为简单,只涉及到 26 个小写字母,我们可以直接把字符个数记录到 C 语言的长度为 26 的整型数组中。在示例 2 中,ransomNote 中需要字符 ‘a’ 两次,而 magazine 中只有一个 ‘a’,因此无法满足条件,返回 false。在示例 3 中,ransomNote 中需要字符 ‘a’ 两次,而 magazine 中有两个 ‘a’,满足条件,返回 true。在示例 1 中,ransomNote 中需要字符 ‘a’,而 magazine 中并没有 ‘a’,因此返回 false。

未来就在脚下。 1124

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

leetcode 383 赎金信

题目: 383. 赎金信 - 力扣(LeetCode) (leetcode-cn.com) 思路一:哈希表法 分析: 判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。用哈希表将字符串 magazines的字符的频率统计出来,然后字符串ransomNote的字符在哈希表中出现过吗,出现过就将这个字符的频率减一; 步骤: 定义一个哈希表 用哈希表统计magazine里面的字符的频率 遍历ransomNote字符串每个字符,如果字符出现在哈希表中,就将哈希表中这个字符的

蜀沐的博客 298

Leetcode 383. 赎金信 C++

Leetcode 383. 赎金信 题目 给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。 (题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。) 注意: 你可以假设两个字符串均只含有小写字母。 测试样例 canConstruct("a", "b") -

weixin_43750513的博客 467

力扣解题-383. 赎金信

哈希表法(第一次解答):逻辑直观但嵌套遍历+哈希表开销导致性能差,仅适合理解核心思路;数组计数法(第二次解答):最优解,O(n+m)时间+O(1)空间,利用字母特性优化存储,性能拉满;字符数组优化版:工程级最优,减少charAt()开销,超大数据量下更友好;排序双指针法:拓展思路,无额外计数空间但时间复杂度高,适合特殊限制场景;关键优化技巧:字符类计数优先用固定长度数组(如26/128)替代HashMap,避免哈希开销;提前预判边界条件(长度不足直接返回),减少无效计算;

qq_38261626的博客 939

LeetCode 383. 赎金信

1. 题目 给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。 如果可以构成,返回 true ;否则返回 false。 (题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。) 注意: 你可以假设两个...

Michael是个半路程序员 865

LeetCode383.赎金信

LeetCode383.赎金信

Love Peace 1046

Leetcode 383. 赎金信

后来想想之前的做法不能用,那只能利用 defaultdict 来计数,将两个字符串中的字符进行计数。之后再循环遍历生成的 dict,看看 ransomNote 对应的字符数量是否小于 magazine 对应的字符数量,小于的话就返回 False。给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。输入:ransomNote = “aa”, magazine = “aab”否则返回 false。,还能这么想,真的牛。

li_yizhixiaowukong的博客 783

LeetCode 383.赎金信

随着时间的推移,算法能力已经成为了衡量一个程序员好坏的标准,检查刷题已经可以称为是程序员的习惯,无论是为了找工作还是打比赛让我们一起刷题吧!这篇文章是对于Leetcode 383.赎金信的题解。下面是博主对于 Leetcode 383.赎金信 的一些看法与解决方式,附有代码和注释,请放心食用写题目时的一些想法以及收获。

akdjhgwehw的博客 306

力扣:383题. 赎金信

​力扣383. 赎金信的Python3解答

weixin_47337647的博客 633

力扣:383. 赎金信

力扣:383. 赎金信 题目描述: 给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。 (题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。) 示例1️⃣: 输入:ransomNote = "a", magazine = "b" 输出:false 示例2

01解题者~博客 276
上一篇: 【中等】力扣算法题解析LeetCode384:打乱数组
下一篇: 【中等】力扣算法题解析LeetCode386:字典序排数
达文汐
达文汐 大学讲师 大学讲师
博客等级 码龄7年 1268粉丝 455原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

达文汐

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

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

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

打赏作者

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

抵扣说明:

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

余额充值