-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path383.ransom-note.js
130 lines (116 loc) · 2.63 KB
/
383.ransom-note.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
* @lc app=leetcode id=383 lang=javascript
*
* [383] Ransom Note
*
* https://leetcode.com/problems/ransom-note/description/
*
* algorithms
* Easy (49.55%)
* Total Accepted: 107.8K
* Total Submissions: 217.5K
* Testcase Example: '"a"\n"b"'
*
*
* Given an arbitrary ransom note string and another string containing letters
* from all the magazines, write a function that will return true if the
* ransom
* note can be constructed from the magazines ; otherwise, it will return
* false.
*
*
* Each letter in the magazine string can only be used once in your ransom
* note.
*
*
* Note:
* You may assume that both strings contain only lowercase letters.
*
*
*
* canConstruct("a", "b") -> false
* canConstruct("aa", "ab") -> false
* canConstruct("aa", "aab") -> true
*
*
*/
/**
* @param {string} ransomNote
* @param {string} magazine
* @return {boolean}
*/
/*
Solution 1 : Finding solution positive way(Linear Approach Solution O(n))
build hashMap for magazine
{
a:2,
b:1
}
hashMap deduction
{
a:2
}
positive, true
*/
/*
Solution 2: Finding solution negative way , proving the ransomNote cannot be generated using the hashmap
Smart thing is proving correct need must run through all sample space,
but proving wrong is just needing one element wrong
characterFind
hash{
magazineCharacterIndex: true
}
e.g
aa,aab
a in first loop of aab,
0:true
*/
function isRansomNoteCanNotUse(
ransomNoteCharacter,
j,
magazine,
usedCharByCharIndexInMagazine
) {
let magazineCharacter = magazine[j];
if (usedCharByCharIndexInMagazine[j]) {
return true;
}
return magazineCharacter !== ransomNoteCharacter;
}
function isRansomNoteCanUse(
ransomNoteCharacter,
j,
magazine,
usedCharByCharIndexInMagazine
) {
let magazineCharacter = magazine[j];
if (usedCharByCharIndexInMagazine[j]) {
return false;
}
return magazineCharacter === ransomNoteCharacter;
}
var canConstruct = function(ransomNote, magazine) {
var usedCharByCharIndexInMagazine = {};
for (var ransomNoteCharacter of ransomNote) {
for (var j = 0, magazineLength = magazine.length; j < magazineLength; j++) {
if (
isRansomNoteCanUse(
ransomNoteCharacter,
j,
magazine,
usedCharByCharIndexInMagazine
)
) {
usedCharByCharIndexInMagazine[j] = true;
break;
}
}
//Loop through the magazine but still not find, so return false
if (j === magazineLength) {
// console.log("failure,hash", ransomNoteCharIsFoundByCharIndex);
return false;
}
}
// console.log("hash", ransomNoteCharIsFoundByCharIndex);
return true;
};