题目来源:LeetCode 383. 赎金信
问题抽象: 给定两个字符串 ransomNote(赎金信内容)和 magazine(杂志内容),要求判断 ransomNote 是否能由 magazine 中的字符 完全构造(即 magazine 包含 ransomNote 的所有字符且数量充足),满足以下核心需求:
-
构造规则定义:
- 字符使用需 严格匹配(区分大小写,但题目限定小写字母);
- 每个字符只能使用一次(
magazine中字符不可重复使用); - 构造过程需保持字符顺序无关(仅需字符频次满足)。
-
计算约束:
- 时间复杂度 O(m+n)(
m,n为字符串长度),空间复杂度 O(1)(固定长度数组); - 使用 频次统计数组(长度
26):- 遍历
magazine统计各字符频次; - 遍历
ransomNote递减频次,若任意字符频次<0则失败。
- 遍历
- 时间复杂度 O(m+n)(
-
边界处理:
ransomNote为空 → 返回true(无需字符);magazine为空且ransomNote非空 → 返回false;magazine长度< ransomNote长度 → 直接返回false(字符总量不足);- 特殊用例:
ransomNote="a",magazine="b"→false;ransomNote="aa",magazine="aab"→true('a'频次2≥2);ransomNote="abc",magazine="cba"→true(顺序无关)。
-
字符范围:
- 输入字符串仅包含小写英文字母(无需处理大小写或特殊符号);
- 频次数组索引:
char - 'a'(0-25)。
输入:字符串 ransomNote(长度 ≥0),字符串 magazine(长度 ≥0)。
输出:布尔值(true 表示可构造,false 表示不可构造)。
解题思路
题目要求判断字符串 ransomNote 是否能由字符串 magazine 中的字符组成(每个字符只能使用一次)。核心思路如下:
- 边界处理:若
ransomNote长度大于magazine,直接返回false(字符数量不足)。 - 字符计数:使用长度 26 的数组(对应小写字母)统计
magazine中各字符出现次数。 - 匹配验证:遍历
ransomNote,在计数数组中减掉对应字符的计数。若任何字符计数减后小于 0,说明magazine中该字符不足,返回false。 - 结果返回:若遍历完
ransomNote所有字符均满足,则返回true。
时间复杂度:O(m + n)(m 和 n 分别为两字符串长度)。空间复杂度:O(1)(固定长度数组)
代码实现(Java版)🔥点击下载源码
class Solution {
public boolean canConstruct(String ransomNote, String magazine) {
// 边界处理:赎金信比杂志长,必然无法构造
if (ransomNote.length() > magazine.length()) {
return false;
}
// 初始化26个小写字母的计数数组(索引:0->'a', 1->'b', ... 25->'z')
int[] charCount = new int[26];
// 统计杂志中每个字符的出现次数
for (char c : magazine.toCharArray()) {
charCount[c - 'a']++; // 'c' - 'a' 将字符映射到0-25的索引
}
// 检查赎金信中的每个字符
for (char c : ransomNote.toCharArray()) {
// 当前字符计数减1,若减后小于0说明杂志中该字符不足
if (--charCount[c - 'a'] < 0) {
return false;
}
}
return true; // 所有字符均匹配成功
}
}
代码说明
- 边界处理:第 4 行直接排除
ransomNote长度更大的情况,避免无效计算。 - 计数数组:
- 第 8 行创建长度为 26 的数组
charCount(对应英文小写字母)。 - 第 11-13 行遍历
magazine,通过c - 'a'将字符转为索引(如'a'→0,'b'→1),并增加计数。
- 第 8 行创建长度为 26 的数组
- 字符匹配:
- 第 16-19 行遍历
ransomNote,对每个字符在计数数组中减 1。 - 若减后值
< 0(第 18 行),说明magazine中该字符数量不足,立即返回false。
- 第 16-19 行遍历
- 返回结果:第 21 行返回
true,表示ransomNote所有字符均能从magazine中匹配。
提交详情(执行用时、内存消耗)

1206

被折叠的 条评论
为什么被折叠?



