赎金信[简单]

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

相关推荐
精英的英30 分钟前
记一次 Qt5 Language Server 开发
开发语言·vscode·qt
步行cgn31 分钟前
MyBatis 多对一关联映射详解
java
仍然.34 分钟前
SpringCloud---Eureka介绍
java·spring cloud·eureka
霸道流氓气质38 分钟前
Spring 事务同步机制 —— AfterTransactionActionCollector 的异步解耦原理
java·后端·spring
烧酒同学40 分钟前
【C++】记录size of std::vector的巧妙坑
开发语言·c++·图形渲染
Lightpwd1 小时前
PostgreSQL jsonb 写入踩坑:一条 `\u0000` 如何让整批同步失败,还把异常伪装成“数据完整性冲突”
java
周周哈哈哈1 小时前
线程创建、执行、退出、回收
java·开发语言
云边有个稻草人1 小时前
飞算JavaAI能处理SaaS套餐变更业务吗?
java·springboot·ai编程·java开发·飞算javaai·java代码生成·ai coding模型
gb42152871 小时前
python中Web应用服务器
开发语言·前端·python
地平线开发者1 小时前
量化为什么会有损失:从量化误差到精度下降
算法