-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcountConstruct.js
52 lines (42 loc) · 2.3 KB
/
countConstruct.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
//countConstruct(targetStr, wordBank)
//returns the number of ways to construct targetStr from wordBank words;
//can resuse words from wordBank
function countConstruct(targetStr, wordBank, memo={}) {
if (targetStr in memo) return memo[targetStr];
if (targetStr === '') return 1;
let possibilities = 0;
for(let word of wordBank) {
if (targetStr.indexOf(word) === 0) {
const restOfWord = targetStr.substr(word.length);
possibilities += countConstruct(restOfWord, wordBank, memo);
}
}
memo[targetStr] = possibilities;
return possibilities;
}
//n = wordBank.length
//m = targetStr.length
//Brute Force:
//Time: O(n^m * m)
//Space: O(m^2)
//Memoized:
//Time: O(n*m^2)
//Space: O(m^3?)
console.log(countConstruct('abcdef', ['ab','abc','cd','defg','abcd'])) //0
console.log(countConstruct('abcdef', ['ab','abc','cd','def','abcd'])) //1
console.log(countConstruct('abcdef', ['ab','abc','cd','def','abcd', 'cdef'])) //2
console.log(countConstruct('abcdef', ['ab','abc','cd','ef','def','abcd', 'cdef'])) //4
console.log(countConstruct('abcdef', ['ab','abc','cd','ef','def','abcd', 'cdef', 'a', 'b'])) //6
console.log(countConstruct('eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeg', ['e','ab','abc','cd','ef','def','abcd', 'cdef', 'a', 'b'])) //6
console.log(countConstruct('alimony', ['ali','mony','ate','boar','t'])) //true
console.log(countConstruct('alimony', ['al','mony','i','boar','t'])) //true
console.log(countConstruct('alimony', ['al','mon','i','boar','y'])) //true
console.log(countConstruct('alimony', ['al','mon','i','boar','t'])) //false
console.log(countConstruct('skateboard', ['ska','sk','ate','boar','t'])) //false
console.log(countConstruct('skateboard', ['ska','sk','ate','boar','t'])) //false
console.log(countConstruct('skateboard', ['ska','sk','ate','boar','t','k','c','d','f','skatebo'])) //true
console.log(countConstruct('purple', ['purp','p','ur','le','purpl'])) //2
console.log(countConstruct('abcdef', ['ab','abc','cd','def','abcd'])) //true
console.log(countConstruct('skateboard', ['bo','rd','ate','boar','t', 'ska', 'sk'])) //false
console.log(countConstruct('enterapotentpot', ['a','p','ent','enter','ot', 'o', 't'])) //true
console.log(countConstruct('eeeeeeeeeeeeeeeeeeeeeeeeeeeef', ['e','ee','eee','eeee','eeeee', 'eeeeee'])) //false