赎金信[简单]

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

相关推荐
菜鸟5555530 分钟前
图论:Floyd算法
算法·图论
呼啦啦啦啦啦啦啦啦5 小时前
常见的排序算法
java·算法·排序算法
anlogic6 小时前
Java基础 8.18
java·开发语言
胡萝卜3.06 小时前
数据结构初阶:排序算法(一)插入排序、选择排序
数据结构·笔记·学习·算法·排序算法·学习方法
地平线开发者6 小时前
LLM 中 token 简介与 bert 实操解读
算法·自动驾驶
lyx33136967596 小时前
Pandas数据结构详解Series与DataFrame
数据结构·pandas
沐知全栈开发6 小时前
WebForms XML 文件详解
开发语言
练习时长一年7 小时前
AopAutoConfiguration源码阅读
java·spring boot·intellij-idea
scx201310047 小时前
20250814 最小生成树和重构树总结
c++·算法·最小生成树·重构树
阿巴~阿巴~7 小时前
冒泡排序算法
c语言·开发语言·算法·排序算法