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);
       ...