Concatenated Words

HardArrayStringDynamic ProgrammingDepth-First SearchTrie

Solution

export function findAllConcatenatedWordsInADict(words: string[]): string[] {
  const dict = new Set<string>(words);
 
  const dfs = (word: string, start: number, visited: boolean[]) => {
    if (start === word.length) {
      return true;
    }
    if (visited[start]) {
      return false;
    }
    visited[start] = true;
 
    // if start is 0 (it mean first word), check until lastIndex - 1.
    const lastEndIndex = start === 0 ? word.length - 1 : word.length;
    for (let end = lastEndIndex; start < end; end--) {
      if (dict.has(word.substring(start, end)) && dfs(word, end, visited)) {
        return true;
      }
    }
 
    return false;
  };
 
  const answer = new Array<string>();
  for (const word of words) {
    const visited = new Array<boolean>(word.length).fill(false);
    if (dfs(word, 0, visited)) {
      answer.push(word);
    }
  }
 
  return answer;
}