Description
Given an array of strings words (without duplicates), return all the concatenated words in the given list of words.
A concatenated word is defined as a string that is comprised entirely of at least two shorter words (not necessarily distinct)Β in the given array.
Β
Example 1:
Input: words = ["cat","cats","catsdogcats","dog","dogcatsdog","hippopotamuses","rat","ratcatdogcat"] Output: ["catsdogcats","dogcatsdog","ratcatdogcat"] Explanation: "catsdogcats" can be concatenated by "cats", "dog" and "cats"; "dogcatsdog" can be concatenated by "dog", "cats" and "dog"; "ratcatdogcat" can be concatenated by "rat", "cat", "dog" and "cat".
Example 2:
Input: words = ["cat","dog","catdog"] Output: ["catdog"]
Β
Constraints:
- 1 <= words.length <= 104
- 1 <= words[i].length <= 30
- words[i]consists of only lowercase English letters.
- All the strings of wordsare unique.
- 1 <= sum(words[i].length) <= 105
Solution
Python3
class Solution:
    def findAllConcatenatedWordsInADict(self, words: List[str]) -> List[str]:
        s = set(words)
 
        @cache
        def go(word):
            for i in range(1, len(word)):
                prefix = word[:i]
                suffix = word[i:]
 
                if prefix in s and (suffix in s or go(suffix)):
                    return True
            
            return False
        
        res = []
        for word in words:
            if go(word):
                res.append(word)
        
        return res