力扣: 赎金信

文章目录

需求

给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。

如果可以,返回 true ;否则返回 false 。

magazine 中的每个字符只能在 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

ransomNote 和 magazine 由小写英文字母组成

分析及编码

感觉这个题目和题意没有一点的关联啊...

判断 ransomNote 能不能由 magazine 里面的字符构成。

如果可以,返回 true ;否则返回 false 。ransomNote 和 magazine 由小写英文字母组成

提示里说都是小写字母组成的, 第一反应是用数组:

java 复制代码
public boolean canConstruct(String ransomNote, String magazine) {
    int[] ransomNoteCount = new int[26];
    for (int i = 0; i < ransomNote.length(); i++) {
        char c = ransomNote.charAt(i);
        int index = ransomNote.charAt(i) -'a';
        ransomNoteCount[index]++;
    }
    for (int i = 0; i < magazine.length(); i++) {
        int index = magazine.charAt(i) -'a';
        ransomNoteCount[index]--;
    }
    for (int i = 0; i < ransomNoteCount.length; i++) {
        if (ransomNoteCount[i] > 0) {
            return false;
        }
    }
    return true;
}

代码解释:

初始化字符计数数组:

java 复制代码
int[] ransomNoteCount = new int[26]; 

创建一个长度为26的整数数组 ransomNoteCount,用于记录 ransomNote 中每个字母的出现次数。这里假设输入的字符都是小写字母(a-z),因此数组的长度是26。

统计 ransomNote 中的字符出现次数:

java 复制代码
for (int i = 0; i < ransomNote.length(); i++) {
    char c = ransomNote.charAt(i);
    int index = ransomNote.charAt(i) - 'a';
    ransomNoteCount[index]++;
}

通过循环遍历 ransomNote 的每个字符,计算每个字符出现的次数:
char c = ransomNote.charAt(i); 获取当前字符。
int index = ransomNote.charAt(i) - 'a'; 计算当前字符在 ransomNoteCount 数组中的索引。这个计算基于 ASCII 值,例如字符 a 的 ASCII 值是97,b 是98,依此类推。
ransomNoteCount[index]++; 增加对应索引的计数。

减少 magazine 中的字符出现次数:

java 复制代码
for (int i = 0; i < magazine.length(); i++) {
    int index = magazine.charAt(i) - 'a';
    ransomNoteCount[index]--;
}

接着,遍历 magazine 的每个字符:

计算当前字符的索引并减少 ransomNoteCount 中对应索引的计数。这表示 magazine 中的字符可以"消费"掉相应数量的 ransomNote 中的字符。

检查 ransomNoteCount 中的计数:

java 复制代码
for (int i = 0; i < ransomNoteCount.length; i++) {
    if (ransomNoteCount[i] > 0) {
        return false;
    }
}

最后,遍历 ransomNoteCount 数组,检查是否还有剩余的字符:

如果发现任何索引的值大于0,意味着 ransomNote 中的某个字符数量超过了 magazine 中的字符数量,返回 false。

如果所有索引的值都小于或等于0,说明 magazine 中的字符足够用来构造 ransomNote,返回 true。

返回结果:
return true;

如果通过了上述检查,返回 true,表示可以构造 ransomNote。

执行结果:

结尾

以上 是我对这道算法的一些遐想和延伸, 可能不是最优解, 但是算法的优化嘛 本身就是一个思索的过程, 能在这个思索和迭代的过程中有所收获和乐趣就是在成长了, 欢迎大家一起来交流更多的解答...

相关推荐
Q741_147几秒前
C++ 力扣 438.找到字符串中所有字母异位词 题解 优选算法 滑动窗口 每日一题
c++·算法·leetcode·双指针·滑动窗口
Fine姐10 分钟前
数据挖掘3.6~3.10 支持向量机—— 核化SVM
算法·支持向量机·数据挖掘
码熔burning35 分钟前
JVM 面试精选 20 题(续)
jvm·面试·职场和发展
野渡拾光2 小时前
【考研408数据结构-05】 串与KMP算法:模式匹配的艺术
数据结构·考研·算法
tainshuai4 小时前
用 KNN 算法解锁分类的奥秘:从电影类型到鸢尾花开
算法·分类·数据挖掘
Coovally AI模型快速验证9 小时前
农田扫描提速37%!基于检测置信度的无人机“智能抽查”路径规划,Coovally一键加速模型落地
深度学习·算法·yolo·计算机视觉·transformer·无人机
pusue_the_sun9 小时前
数据结构:二叉树oj练习
c语言·数据结构·算法·二叉树
RaymondZhao3410 小时前
【全面推导】策略梯度算法:公式、偏差方差与进化
人工智能·深度学习·算法·机器学习·chatgpt
zhangfeng113310 小时前
DBSCAN算法详解和参数优化,基于密度的空间聚类算法,特别擅长处理不规则形状的聚类和噪声数据
算法·机器学习·聚类
圣保罗的大教堂11 小时前
leetcode 2348. 全 0 子数组的数目 中等
leetcode