472. Concatenated Words
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 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
words
are unique. 1 <= sum(words[i].length) <= 105
Solution
concatenated-words.py
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