LeetCode算法题-Ransom Note(Java实现)

JAVA 赎金信 要求:给定一个赎金信 (ransom) 字符串和一个杂志(magazine)字符串,判断第一个字符串 ransom 能不能由第二个字符串 magazines 里面的字符构成。如果可以构成,返回 true ;否则返回 false。 (题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符串中的每个字符只能在赎金信字符串中使用一次。) 具体代码及运行结果实例如下: public class Test1_19 { public static boolean ca 阅读详情

这是悦乐书的第212次更新,第225篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第80题(顺位题号是383)。给定一个任意赎金票据字符串和另一个包含所有杂志字母的字符串,如果赎金票据可以从杂志中构建,则写一个函数将返回true;否则,它将返回false。杂志字符串中的每个字母只能在赎金票据中使用一次。例如:

canConstruct(“a”,“b”) - > false
canConstruct(“aa”,“ab”) - > false
canConstruct(“aa”,“aab”) - > true

注意:您可以假设两个字符串仅包含小写字母。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

因为只有小写字母,可以将magazine所使用到的字符存入一个长度为26的数组,然后再去遍历ransomNote所使用到的字符,只要数组中某一位元素小于0,则返回false。

此解法的时间复杂度是O(n),空间复杂度是O(1)。

public boolean canConstruct(String ransomNote, String magazine) {
    int[] arr = new int[26];
    for (int i=0; i<magazine.length(); i++) {
        arr[magazine.charAt(i)-'a']++;
    }
    for (int j=0; j<ransomNote.length(); j++) {
        if (--arr[ransomNote.charAt(j)-'a'] < 0) {
            return false;
        }
    }
    return true;
}

03 第二种解法

思路和第一种解法一样,只不过是将传入的两个字符串先转换成字符数组而已。

此解法的时间复杂度是O(n),空间复杂度是O(n)。

public boolean canConstruct2(String ransomNote, String magazine) {
    int[] arr = new int[26];
    char[] note = ransomNote.toCharArray();
    char[] maz = magazine.toCharArray();
    for (int i=0; i<maz.length; i++) {
        arr[maz[i]-'a']++;
    }
    for (int j=0; j<note.length; j++) {
        if (arr[note[j]-'a']-- == 0) {
            return false;
        }
    }
    return true;
}

04 第三种解法

使用HashMap,先将magazine所使用的字符以及出现次数分别作为key和value存入其中,然后遍历ransomNote的字符,如果其当前字符在map中存在,并且其value值在减1后依然大于等于0,那么将此字符所对应的value值减1,反之直接返回false。

此解法因为用到了HashMap的contains方法,因此时间复杂度最好情况是O(n),最坏情况是O(n^2),空间复杂度是O(n)。

public boolean canConstruct3(String ransomNote, String magazine) {
    Map<Character, Integer> map = new HashMap<Character, Integer>();
    for (int i=0; i<magazine.length(); i++) {
        char c = magazine.charAt(i);
        map.put(c, map.getOrDefault(c, 0)+1);
    }
    for (int j=0; j<ransomNote.length(); j++) {
        char c = ransomNote.charAt(j);
        if (map.containsKey(c) && map.get(c)-1 >= 0) {
            map.put(c, map.get(c)-1);
        } else {
            return false;
        }
    }
    return true;
}

05 第四种解法

依旧是使用HashMap,但是将第三种解法里面的两个循环压缩到一个循环里。循环遍历的对象依旧是ransomNote,获取当前字符c,同时定义一个变量pos,先判断c是否存在于map中,如果c存在于map中,则获取其对应的value并加1,再重新赋值给pos,如果pos大于magazine的长度,直接返回false。

接着重新获取pos的值,等于当前字符在magazine所在的索引(从pos位开始查找),如果pos等于-1,说明当前在ransomNote使用的字符不存在于magazine中,直接返回false,如果pos不等于-1,则将ransomNote的当前字符作为key,该字符在magazine中出现的pos为value存入map中。

此解法因为用到了HashMap的contains方法,因此时间复杂度最好情况是O(n),最坏情况是O(n^2),空间复杂度是O(1)。

public boolean canConstruct4(String ransomNote, String magazine) {
    Map<Character, Integer> map = new HashMap<Character, Integer>();
    for (char c : ransomNote.toCharArray()) {
        int pos = 0;
        if (map.containsKey(c)) {
            pos = map.get(c) + 1;
            if (pos >= magazine.length()) {
                return false;
            }
        }
        pos = magazine.indexOf(c, pos);
        if (pos == -1) {
            return false;
        }   
        map.put(c, pos);
    }
    return true;
}

06 小结

算法专题目前已连续日更超过两个月,算法题文章80+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

基于FFmpeg与Nginx的大华摄像头实时视频Web接入方案 本文详细介绍了一种基于FFmpeg与Nginx的大华摄像头实时视频Web接入方案。该方案通过FFmpeg将摄像头RTSP协议流转换为浏览器友好的HLS格式,并利用Nginx进行高效分发,最终结合Video.js构建前端播放页面,实现无需插件的跨平台实时监控。方案具有免费、轻量、稳定、易于部署的特点,适合中小企业、个人开发者快速搭建内部监控或展示系统。 阅读详情

相关推荐

物联网 Mixly-智能楼道灯

一、实验目的及要求 熟悉声音及人体红外传感器用法。 二、实验原理与内容 1.使用声音传感器实现声控灯功能。 2.使用人体红外传感器实现人体检测控制灯功能。 三、实验软硬件环境 硬件:Arduino、LED灯、声音传感器、人体红外传感器 软件:Mixly IDE 四、实验过程(实验步骤、记录、数据、分析) 核心代码截图 声控灯: 人体红外检测灯: 3.实验效果图: (1)、声控灯总线连接: (1)、声控灯声音大于一某个值时灯亮,经过2秒后灯灭: (3)、人体红外检测灯连接总线: (4)、人体红外

qq_43430810的博客 1918

LeetCode 383:ransomNote(赎金信)

Together for a Shared future一起向未来开个新坑:LeetCode刷题篇,分享每道算法题目背后的知识点。今天带来的一道简单的算法题目《383. 赎金信》。题目描述...

Diligence is the mother of success. 715

芯片设计-信号完整性 SI 解析:Unit Interval 与比特周期的关系及其在高速信号中的应用

本文深入解析了芯片设计中信号完整性(SI)的核心概念Unit Interval(UI)与比特周期的关系及其在高速信号中的应用。通过实际案例和计算公式,详细阐述了UI在不同数据速率下的变化、在眼图分析中的关键作用,以及如何应对高速信号设计中的抖动和码间干扰等挑战。文章还提供了PCB布线和芯片设计中的UI优化技巧,帮助工程师提升高速信号设计的实战能力。

weixin_28683391的博客 470

代码随想录leetcode刷题Day10-哈希表

代码随想录leetcode刷题Day10-哈希表

peach2580的博客 232

基于STM32的智能浇花系统毕业设计(全部资料)

摘要:本文设计了一种基于STM32单片机的智能浇花系统,集成了环境温湿度检测、土壤温湿度监测、LCD显示、Wi-Fi联网及手机APP远程控制等功能。系统通过传感器实时采集环境参数,自动控制水泵工作实现智能灌溉,同时支持用户通过手机APP远程监控和调节。论文详细阐述了硬件选型、软件设计及系统测试过程,验证了系统的稳定性和实用性。该设计为家庭园艺提供了智能化解决方案,具有节水高效、操作便捷等特点。关键词:STM32;智能灌溉;远程控制;环境监测;Wi-Fi通信。

3254968421的博客 1196

网络发生环路了,别慌,这些步骤一定要安排起来!

网络环路是指在计算机网络中,数据包因为某种原因在多个网络设备之间不断循环,形成了一个闭环。这样数据包就永远也无法到达目标,导致网络的流量滞留,设备间的资源耗尽,最终网络性能受到严重影响。网络环路虽然是常见的网络故障,但只要掌握正确的排查和解决方法,面对环路问题时,你就能冷静应对,迅速恢复网络的正常运行。希望这篇文章能帮助你更好地理解和处理网络环路的问题,让你的网络环境更加稳定可靠!🚀📡如果你有任何疑问,或者在实际操作中遇到困难,随时可以联系我,我们一起攻克技术难题!

网络技术联盟站 1969

【LeetCode】383 Ransom Note(java)

原题 题目要求 解法 原题Given
 an 
arbitrary
 ransom
 note
 string 
and 
another 
string 
containing 
letters from
 all 
the 
magazines,
 write 
a 
function 
that 
will 
return 
true 
if 
the 
ransom 
 note 
can

添经地翼的博客 7091

小红书urlscheme和Activity

本文档详细介绍了小红书App的Deeplink跳转规范,涵盖了多个功能模块的跳转协议。主要内容包括:主页各Tab(关注、发现、购买)的跳转方式;不同类型笔记(图文/视频/长笔记)的详情页跳转参数;用户相关页面(主页/绑定/资料/消息等)的跳转协议;搜索功能(输入页/结果页)的跳转方式;以及话题、标签、专辑、H5页面等特殊场景的跳转实现。文档还提供了各跳转协议所需的参数说明,包括参数类型、默认值、是否必填等详细信息,并标注了不同版本和平台的兼容性要求。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 789

【Leetcode】383. Ransom Note

题目地址: https://leetcode.com/problems/ransom-note/ 给定两个字符串,问第一个字符串可否由第二个字符串的字符构成(次数也要考虑)。 直接数一下即可。代码如下: public class Solution { public boolean canConstruct(String ransomNote, String magazine) { int[] mchs = new int[26]; for (int i = 0; i

数学、算法爱好者的博客 493

VN5620以太网测试——DoIP配置

CANoe(CAN open environment)VN5620 :是一个紧凑而强大的接口,用于以太网网络的分析、仿真、测试和验证。VN5620 接口支持各种可能的应用。它适用于与其他总线系统、网络参与(例如在模拟和生成帧、测试中的负载和错误)的同步以太网监控。在2021年Vector公司的以太网接口卡VN5610和VN5640设备已经陆续停产,相应被VN5620和VN5650代替。参考文章了解DoIP协议——汽车以太网应用介绍。

诊断协议那些事儿's blog 3019

用 SAP HANA SDA 访问 PostgreSQL:从可行性到落地实践的完整指引

摘要:SAP HANA可通过SDA/SDI技术访问PostgreSQL数据库,支持数据虚拟化和实时复制。主要实现路径包括:1)使用Camel JDBC适配器创建虚拟表进行联邦查询;2)利用PostgreSQL Log Reader适配器实现变更数据捕获(CDC)。实施时需配置Data Provisioning Agent,注意权限和网络要求。官方文档指出,通过SDI+DP Agent的方式比直接SDA连接更稳定可靠。虚拟化查询时,HANA会自动将SQL下推到PostgreSQL执行,优化性能。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 257

LeetCode之Ransom Note

1、题目 Given an arbitrary ransom note string and another string containing letters from all the magazines, write a function that will return true if the ransom note can be constructed from the maga

码莎拉蒂 2749

从登录到应用可见:在 SAP S/4HANA Cloud Private Edition 中创建用户与打通 SAP Fiori 权限的完整思路

在SAP S/4HANA系统中,用户创建远非简单的账号开通,而是涉及认证、授权、数据访问等多维度的复杂过程。用户主数据记录(User Master Record)是系统访问的起点,包含登录方式、角色分配等关键信息。认证解决"你是谁"的问题,授权则决定"你能做什么"。SAP Fiori访问链路涉及Launchpad内容分配、应用启动映射、OData服务权限等多层校验。角色(Role)通过PFCG维护,包含业务目录(Catalog)和空间(Space)等元素,共同构成完整

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 151

leetcode Ransom Note题解

题目描述: Given an arbitrary ransom note string and another string containing letters from all the magazines, write a function that will return true if the ransom note can be constructed from the magazin...

leo_weile的博客 950

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

[LeetCode] Ransom Note (java)

昨天出长set list map的禁果今天再次尝试了一下,不多说了直接上代码 public class Solution { public boolean canConstruct(String ransomNote, String magazine) { int ranLength = ransomNote.length(),magLength = magazine.l

jsh0123的博客 301

计算机控制技术及应用

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

LeetCode 383. Ransom Note

[Easy] LeetCode 383. Ransom Note 链接: https://leetcode.com/problems/ransom-note/ 题目描述: Given an arbitrary ransom note string and another string containing letters from all the magazines, write a funct...

MrJustin的博客 209

怀旧版电脑GBC模拟器

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

【LeetCode】No.383. Ransom Note -- Java Version

【LeetCode】No.383. Ransom Note -- Java Version 题目链接: https://leetcode.com/problems/ransom-note/

汤姆lazy的优快云博客 2057

【LeetCode】383. Ransom Note 赎金信(Easy)(JAVA)

【LeetCode】383. Ransom Note 赎金信(Easy)(JAVA) 题目地址: https://leetcode.com/problems/ransom-note/ 题目描述: Given an arbitrary ransom note string and another string containing letters from all the magazines, write a function that will return true if the ransom note

qq_16927853的博客 320

【LeetCode】383. Ransom Note 赎金信

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

负雪明烛 1513

Java [Leetcode 383]Ransom Note

题目描述: Given
 an 
arbitrary
 ransom
 note
 string 
and 
another 
string 
containing 
letters from
 all 
the 
magazines,
 write 
a 
function 
that 
will 
return 
true 
if 
the 
ransom 
 note 
can ...

dkk37351的博客 190

LeetCode Ransom Note

原题链接在这里:https://leetcode.com/problems/ransom-note/ 题目: Given an arbitrary ransom note string and another string containing letters from all the magazines, write a function that will return true if t...

weixin_30379911的博客 1230

LeetCode:383 Ransom Note

383. Ransom Note>Given
 an
arbitrary
 ransom
 note
 string 
and 
another
 string 
containing 
letters from
 all
the
magazines

Wisimer 2862

Leetcode——383. Ransom Note

题目原址 https://leetcode.com/problems/ransom-note/description/ 题目描述 Given an arbitrary ransom note string and another string containing letters from all the magazines, write a function that will retur...

想当厨子的程序媛 289

LeetCode 383 Ransom Note 勒索信 C语言

Given an arbitrary ransom note string and another string containing letters from all the magazines, write a function that will return true if the ransom note can be constructed from the magazines ; ot...

高能粒子的博客 351
上一篇: LeetCode算法题-Guess Number Higher or Lower(Java实现)
下一篇: LeetCode算法题-First Unique Character in a String(Java实现)
程序员小川
博客等级 码龄10年 47粉丝 305原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值