TEST 2
by LyndseyB
JavaScript
const trie = {
e: {
a: {
t: {
$: 1
}
},
t: {
a : {
$ : 1
}
}
},
c: {
a: {
t: {
$: 1,
s: {
$: 1
}
}
}
},
r: {
a: {
t: {
$: 1,
e: {
$: 1,
d: {
$: 1
},
r: {
$: 1,
s: {
$: 1
}
}
}
}
},
e: {
d: {
$: 1
},
l: {
a: {
t: {
e: {
$: 1,
d: {
$: 1
},
r: {
$: 1,
s: {
$: 1
}
}
}
}
}
}
}
}
};
const permute = (word, node, prefix = '', words = []) => {
for(let i = 0, len = word.length; i < len; i++) {
const letter = word[i];
if(node.$ === 1 && !words.includes(prefix)) {
words.push(prefix);
}
if(node[letter]) {
const remaining = word.substring(0, i) + word.substring(i + 1, word.length);
permute(remaining, node[letter], prefix + letter, words);
}
}
return words;
};
const getSubAnagrams = (letters) => {
if(typeof letters !== 'string') {
throw(`Sub Anagrams expected string letters, received ${typeof letters}`);
}
return permute(letters, trie);
};
const getAnagrams = (letters) => {
if(typeof letters !== 'string') {
throw(`Anagrams expected string letters, received ${typeof letters}`);
}
const words = [];
const len = letters.length;
const permute = (word, node, prefix = '') => {
if(node.$ === 1 && word.length === 0 && !words.includes(prefix)) {
words.push(prefix);
}
for(let i = 0, len = word.length; i < len; i++) {
const letter = word[i];
if(node[letter]) {
const remaining = word.substring(0, i) + word.substring(i + 1, word.length);
...