class Solution {
public:
bool canConstruct(string ransomNote, string magazine) {
int result[26] = {0};
// 判断ransomNote长度是否大于magazine长度
if (ransomNote.size() > magazine.size()) {
return false;
}
// 统计magazine中每个字符出现的次数
for (int i = 0; i < magazine.size(); i++) {
result[magazine[i]-'a']++;
}
// 检查ransomNote中的每个字符
for (int i = 0; i < ransomNote.size(); i++) {
result[ransomNote[i]-'a']--;
// 检查字符出现次数是否足够
if (result[ransomNote[i]-'a'] < 0) {
return false;
}
}
return true;
}
};
为了判断ransomNote是否能由magazine中的字符构成,我们可以使用一个大小为26的数组result来记录magazine中每个字符出现的次数。首先,我们判断ransomNote的长度是否大于magazine的长度,如果是,则无法构成,返回false。然后,我们遍历magazine,对于每个字符,,将对应的数组元素加1,表示该字符出现了一次。接下来,我们遍历ransomNote,对于每个字符,将其转换为对应的数组索引,将对应的数组元素减1,表示该字符在构建ransomNote时被使用了一次。同时,我们检查数组中对应元素的值,如果小于0,说明magazine中的字符无法满足ransomNote的要求,返回false。最后,若遍历完成,说明所有字符都能够满足要求,返回true。
时间复杂度O(m+n),其中m,n是两个输入数组的长度,空间复杂度为O(1)。