题源: 383. 赎金信
在这个解法中,我们使用一个大小为 26 的整数数组 magCount
来记录每个字符在 magazine
中出现的次数。我们假设输入的字符串仅包含小写字母。此方法有效跟踪了 magazine
中每个字符的供应情况,并对 ransomNote
的每个字符需求进行了检查。
步骤:
- 字符频率统计:遍历
magazine
字符串,为每个字符在magCount
数组中的相应位置增加计数。 - 字符需求检查:遍历
ransomNote
字符串,对于每个字符,从magCount
数组中对应的计数中减去 1。如果任何时候数组中的计数变为负数,意味着magazine
不能提供足够的字符来构建ransomNote
,此时函数返回false
。 - 返回结果:如果
ransomNote
中的所有字符需求都能被满足,函数最终返回true
。
优点:
- 效率高:该方法仅遍历两个字符串各一次,避免了使用双重循环,具有 O(N+M) 的时间复杂度,其中 N 和 M 分别是
magazine
和ransomNote
的长度。 - 空间优化:使用固定大小的数组(26个元素)存储频率,空间复杂度为 O(1)。
- 执行快速:因为每个字符只处理一次,所以相比较频繁的字符串操作(如删除字符)来说,速度更快。
- 避免了不必要的字符串操作:使用数组进行操作,避免了频繁的插入和删除操作。
Code
class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int magCount[26] = {0};
for (char c : magazine) magCount[c - 'a']++;
for (char c : ransomNote)
// 如果某个字符在magazine中的数量少于在ransomNote中的数量,返回false
if (--magCount[c - 'a'] < 0) return false;
return true; // 如果所有字符都能匹配,返回true
}
};