赎金信[简单]

news/2024/10/22 8:00:37/

优质博文: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

【3】哈希表或数组: 我们可以用一个哈希表或长度为26的数组cnt记录字符串magazine中所有字符出现的次数。然后遍历字符串ransomNote,对于其中的每个字符c,我们将其从cnt的次数减1,如果减1之后的次数小于0,说明cmagazine中出现的次数不够,因此无法构成ransomNote,返回false即可。

否则,遍历结束后,说明ransomNote中的每个字符都可以在magazine中找到对应的字符,因此返回true

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

时间复杂度: O(m+n),其中mn分别为字符串ransomNotemagazine的长度;
空间复杂度: O(C),而C为字符集的大小,本题中C = 26

【4】枚举:26字母中出现的字母全部统计一遍到数组中,然后遍历我们组成字符串(字符串转成字符数组),对出现的字母相减,减出来到最后,数组中没有出现小于0的数就是可以组成,相反不能组成

java">class Solution {public static boolean canConstruct(String ransomNote, String magazine) {int [] ans = new int[26];// 将字符串中的字符转换为字符数组for(char c : magazine.toCharArray()){// 26个字母 出现多少次ans[c-'a']++;}for (char c : ransomNote.toCharArray()){if(--ans[c - 'a'] < 0){return false;}}return true;}
}

时间复杂度: O(1)
空间复杂度: O(1)


http://www.ppmy.cn/news/1465889.html

相关文章

vue-标签选择

效果 选中后 代码 <span :class"[item.bealtrue?p_yx_span span_active :span p_yx]" click"onTagSelect(index)" v-for"(item,index) in tagList" :key"index" >{{item.name}} </span> // 列表值 tagList:[ {id: 1, na…

Elasticsearch 认证模拟题 - 5

一、题目 .在集群上有一个索引 food_ingredient&#xff0c;搜索需要满足以下要求&#xff1a; 三个字段 manufacturer&#xff0c;name&#xff0c;brand 都能匹配到文本 cake mix高亮 字段 name&#xff0c;并加标签排序&#xff0c;对字段 brand 正序&#xff0c;_score 降…

6月01日,每日信息差

第一、东航 C919 国产大飞机成功执飞首个跨境商业包机&#xff0c;从上海虹桥机场飞往香港特区&#xff0c;主要目的是为了运送参加 「沪港同心 相聚上海」 实习计划的香港青年学生。当天的返程包机预计在下午从香港起飞&#xff0c;回到虹桥机场&#xff0c;届时将有一场欢迎仪…

嵌入式人工智能开发:基于TensorFlow Lite和Edge TPU的实时对象检测系统

文章目录 引言环境准备人工智能在嵌入式系统中的应用场景代码示例常见问题及解决方案结论 1. 引言 随着人工智能&#xff08;AI&#xff09;和物联网&#xff08;IoT&#xff09;技术的快速发展&#xff0c;嵌入式系统中集成AI技术已成为一种趋势。实时对象检测是AI在嵌入式…

使用QT生成二维码的两种方式

目录 使用QRenCode生成二维码编译生成QRenCode库使用QRenCode结果演示优缺点&#xff1a; 使用QZXing进行二维码的编码和解码编译源码使用QZXing库运行结果优缺点 使用QRenCode生成二维码 编译生成QRenCode库 QRenCode开源库 下载好之后使用cmake-gui打开进行构建生成。 点击…

如何使用JavaScript获取当前URL?

在现代开发中,我们经常需要获取当前网页的URL来完成各种操作,例如页面重定向、参数解析等。在URL的处理上,JavaScript提供了一系列强大且便捷的工具。这篇文章将详细讲解如何使用JavaScript获取当前页面的URL,并分解URL的各个组成部分。 使用JavaScript获取完整的URL 获取…

2024华为OD机试真题-分割均衡字符串-C++(C卷D卷)

题目描述 均衡串定义: 字符串只包含两种字符,且两种字符的个数相同。 给定一个均衡字符串,请给出可分割成新的均衡子串的最大个数。 约定字符串中只包含大写的X和Y两种字符。 输入描述 均衡串: XXYYXY 字符串的长度[2,100001]。给定的字符串均为均衡串 输出描述 可分割为两个…

设计模式 22 访问者模式 Visitor Pattern

设计模式 22 访问者模式 Visitor Pattern 1.定义 访问者模式是一种行为型设计模式&#xff0c;它允许你在不改变已有类结构的情况下&#xff0c;为一组对象添加新的操作。它将算法与对象结构分离&#xff0c;使你能够在不修改现有类的情况下&#xff0c;为这些类添加新的操作。…