【LeetCode刷题日记】383 赎金信

🔥个人主页:北极的代码(欢迎来访)

🎬作者简介:java后端学习者

❄️个人专栏:苍穹外卖日记SSM框架深入JavaWeb

命运的结局尽可永在,不屈的挑战却不可须臾或缺!
【摘要】

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

题目背景:LeetCode 383

给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。

(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。)

注意:

你可以假设两个字符串均只含有小写字母。

canConstruct("a", "b") -> false

canConstruct("aa", "ab") -> false

canConstruct("aa", "aab") -> true

题目答案:

java 复制代码
class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        // shortcut
        if (ransomNote.length() > magazine.length()) {
            return false;
        }
        // 定义一个哈希映射数组
        int[] record = new int[26];

        // 遍历
        for(char c : magazine.toCharArray()){
            record[c - 'a'] += 1;
        }

        for(char c : ransomNote.toCharArray()){
            record[c - 'a'] -= 1;
        }
        
        // 如果数组中存在负数,说明ransomNote字符串中存在magazine中没有的字符
        for(int i : record){
            if(i < 0){
                return false;
            }
        }

        return true;
    }
}

题目解析:

这道题目和242.有效的字母异位词很像,242.有效的字母异位词相当于求 字符串a 和 字符串b 是否可以相互组成 ,而这道题目是求 字符串a能否组成字符串b,而不用管字符串b 能不能组成字符串a。

然后需要注意的是:

本题判断第一个字符串ransom能不能由第二个字符串magazines里面的字符构成,但是这里需要注意两点。

  • 第一点"为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思" 这里说明杂志里面的字母不可重复使用。

  • 第二点 "你可以假设两个字符串均只含有小写字母。" 说明只有小写字母 ,这一点很重要

根据前面我们做这种相关题目的经验,我们先定义一个哈希映射数组,然后开始遍历后面的magazine,

复制代码
   record[c - 'a'] += 1;

这步的意思就是记录magazine中存在的元素,存在一个就映射一个,


需要注意的:

toCharArray() 是干什么的:把字符串 变成 字符数组,方便用增强 for 循环一个个拿字符。

假如:

复制代码
String str = "abc";

执行:

复制代码
char[] arr = str.toCharArray();

结果:

复制代码
arr 变成了 ['a', 'b', 'c']

就是 字符串 → 字符数组

然后接下来,我们遍历我们需要的ransom,加到同一个映射数组中,转成字符之后,如果存在,就在数组的相应位置自减,如果数组中有位置出现负数,则代表magazine中没有这个字母,因此才会变成负数。

相关推荐
moonrailgun2 分钟前
用 Node.js 复刻 Codex Astra 的终端星光
前端·javascript·算法
罗西的思考30 分钟前
[Agent Memory / 强化学习] MemPO源码学习笔记 ---(1)--- 总体
人工智能·算法·机器学习
lvwangshu1 小时前
图论:LCA、树的直径、树的重心、二分图与 Tarjan 缩点
算法·图论
后台模板学习1 小时前
2026最新面试真题:到达用英语怎么说背后的逻辑与源码剖析
面试·职场和发展·php
CoderYanger2 小时前
前端基础——JavaScript(WebAPI)(下篇)
java·开发语言·前端·javascript·程序人生·面试·职场和发展
302wanger2 小时前
干与湿:AI 拿走脑力之后,人剩下什么
算法
计算机编程-吉哥3 小时前
脑肿瘤MRI智能识别系统:基于深度学习的像素级脑肿瘤语义分割平台【计算机毕业设计选题推荐】
人工智能·python·深度学习·算法·毕业设计·课程设计·大数据毕业设计选题推荐
用户204937554953 小时前
端侧语音部署踩坑:模型能跑不等于终端真的能用
后端·算法
shehuiyuelaiyuehao4 小时前
算法39,位运算,消失的两个数字
java·数据结构·算法
ZiLing4 小时前
2026 ROS 2 Lyrical 踩坑实录(一):编译与依赖——rosdep、现代 CMake 与 CMake 4.x
算法