题目:
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/ransom-note
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例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 由小写英文字母组成
解法一:字符统计
1. 如果字符串 ransomNote 的长度大于 字符串 magazine 的长度,则说明 magazine 肯定无法构成 ransomNote ,直接返回 false;
2. 由于构成字符串的字符一共只有 26个(a-z),所以可以直接统计 magazine 中各个字符出现的次数,并按顺序存储到一个容量为 26 的数组 arr 中。
3. 遍历 ransomNote ,并在 arr 中删除对应下标的数量,当数量 <1 时,说明 magazine 无法构成 ransomNote ,直接返回 false即可。
/**
* @param {string} ransomNote
* @param {string} magazine
* @return {boolean}
*/
var canConstruct = function(ransomNote, magazine) {
if (ransomNote.length > magazine.length) {
return false;
}
const arr = new Array(26).fill(0);
for (let i = 0, len = magazine.length; i < len; i++) {
arr[magazine.charCodeAt(i) - 'a'.charCodeAt()]++;
}
for (let i = 0, len = ransomNote.length; i < len; i++) {
arr[ransomNote.charCodeAt(i) - 'a'.charCodeAt()]--;
if (arr[ransomNote.charCodeAt(i) - 'a'.charCodeAt()] < 0) {
return false;
}
}
return true;
};
解法二:HashMap
1.将 magazine 的元素及其出现次数存放到哈希表 map 中;
2. 遍历 ransomNote ,不断更新哈希表 map 中的值 +1;
3. 当该值大于等于 1 时,更新 map 值 -1。
/**
* @param {string} ransomNote
* @param {string} magazine
* @return {boolean}
*/
var canConstruct = function(ransomNote, magazine) {
const map = new Map();
for (let i = 0, len = magazine.length; i < len; i++) {
const val = map.get(magazine[i]);
map.set(magazine[i], val == undefined ? 1 : val + 1);
}
for (let i = 0, len = ransomNote.length; i < len; i++) {
const val = map.get(ransomNote[i]);
if (val) {
map.set(ransomNote[i], val - 1);
} else {
return false;
}
}
return true;
};