class Solution {
public List<String> findAllConcatenatedWordsInADict(String[] words) {
int n = words.length;
Set<String> dic = new HashSet<>();
for (String word : words) {
dic.add(word);
}
List<String> ans = new ArrayList<>();
for (int i = 0; i < n; i++) {
dic.remove(words[i]);
if (wordBreak(words[i], dic)) {
ans.add(words[i]);
}
dic.add(words[i]);
}
return ans;
}
private boolean wordBreak(String s, Set<String> dic) {
boolean[] dp = new boolean[s.length() + 1];
dp[0] = true;
for (int i = 1; i <= s.length(); i++) {
for (int j = 0; j < i; j++) {
if (dic.contains(s.substring(j, i)) && dp[j]) {
dp[i] = true;
break;
}
}
}
return dp[s.length()];
}
}