Last active
          April 13, 2020 21:17 
        
      - 
      
 - 
        
Save mrboli/aebce571b3dbf9197197265149fa7d6b to your computer and use it in GitHub Desktop.  
    All Concat Words
  
        
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
  | var findAllConcatenatedWordsInADict = function(words) { | |
| words.sort((a, b) => a.length - b.length); | |
| let wordSet = new Set(); | |
| words.forEach(word => { | |
| // Use Trie | |
| if (word) wordSet.add(word); | |
| }); | |
| // DFS | |
| function DFS(searchWord, searchSet) { | |
| if (searchWord === '') return true; | |
| return Array.from(searchSet).some(word => { | |
| if (searchWord.startsWith(word)) { | |
| const remainingWord = searchWord.substr(word.length, searchWord.length); | |
| if (remainingWord === '') return true; | |
| return DFS(remainingWord, searchSet); | |
| } | |
| }); | |
| } | |
| const validWords = []; | |
| wordSet.forEach(word => { | |
| const currentSet = new Set(wordSet); | |
| currentSet.delete(word); | |
| if (DFS(word, currentSet)) { | |
| validWords.push(word); | |
| } | |
| }); | |
| return validWords; | |
| }; | 
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
  | var findAllConcatenatedWordsInADict = function(words) { | |
| // words.sort((a, b) => a.length - b.length); | |
| const wordsByLength = {}; | |
| let wordSet = new Set(); | |
| words.forEach(word => { | |
| if (!word) return; | |
| wordSet.add(word); | |
| const length = word.length; | |
| if (length in wordsByLength === false) { | |
| wordsByLength[length] = []; | |
| } | |
| wordsByLength[length].push(word); | |
| }); | |
| const validWords = []; | |
| const lengthKeys = Object.keys(wordsByLength).sort((a, b) => Number(a) - Number(b)); | |
| lengthKeys.forEach((length, i) => { | |
| wordsByLength[length].forEach(word => { | |
| const searchKeys = lengthKeys.slice(0, i + 1); | |
| const searchWords = new Set(searchKeys.reduce((arr, length) => { | |
| return arr.concat(wordsByLength[length]); | |
| }, [])); | |
| searchWords.delete(word); | |
| if (DFS(word, searchWords)) validWords.push(word); | |
| }); | |
| }); | |
| return validWords; | |
| // DFS | |
| function DFS(searchWord, searchSet) { | |
| if (searchWord === '') return true; | |
| return Array.from(searchSet).some(word => { | |
| if (searchWord.startsWith(word)) { | |
| const remainingWord = searchWord.substr(word.length, searchWord.length); | |
| if (remainingWord === '') return true; | |
| return DFS(remainingWord, searchSet); | |
| } | |
| }); | |
| } | |
| }; | 
  
    Sign up for free
    to join this conversation on GitHub.
    Already have an account?
    Sign in to comment