Ransom Note
Problem
Given two strings
ransomNote
andmagazine
, returntrue
ifransomNote
can be constructed by using the letters frommagazine
andfalse
otherwise.Each letter in
magazine
can only be used once inransomNote
.
Example 1:
Input: ransomNote = "a", magazine = "b" Output: false
Example 2:
Input: ransomNote = "aa", magazine = "ab" Output: false
Example 3:
Input: ransomNote = "aa", magazine = "aab" Output: true
Pseudocode
create a collection of letters and their sum {letters : sum} of magazine with a map
loop over ransomNote and deducut -1 from map for each letter
if !map[letter] or if map[letter] < 0, then there there isn't enough letters for the ransome note
Solution
var canConstruct = function (ransomNote, magazine) {
const ransomArr = ransomNote.split("");
const magazineArr = magazine.split("");
let ransomObj = {};
let result = true;
for (let i = 0; i < magazineArr.length; i++) {
const letter = magazineArr[i];
if (!ransomObj[letter]) {
ransomObj[letter] = 1;
continue;
}
ransomObj[letter] += 1;
}
for (let i = 0; i < ransomArr.length; i++) {
const letter = ransomArr[i];
if (!ransomObj[letter]) {
result = false;
break;
}
if (ransomObj[letter] > 0) {
ransomObj[letter] -= 1;
}
}
return result;
};
Time and Space Complexity
Time
Two loops are performed, one to create the map, the other to find matching letters for the ransom note. Both are performed independently - O(N)
Total - O(N)
Space
Map created to store letters and count, space requirements increases with input size - O(N)
Total - O(N)
Last updated