Palindrome Partitioning

MediumStringDynamic ProgrammingBacktracking

Solution

export function partition(s: string): string[][] {
  function isPalindrome(s: string) {
    if (s.length === 0) {
      return false;
    }
    for (let i = 0; i <= s.length / 2; i++) {
      if (s[i] !== s[s.length - i - 1]) {
        return false;
      }
    }
    return true;
  }
 
  const answer: string[][] = [];
  function dfs(i: number, current: string, substrings: string[]) {
    if (i === s.length) {
      if (isPalindrome(current)) {
        answer.push([...substrings, current]);
      }
      return;
    }
    if (isPalindrome(current)) {
      substrings.push(current);
      dfs(i + 1, s[i], substrings);
      substrings.pop();
    }
    dfs(i + 1, current + s[i], substrings);
  }
  dfs(0, '', []);
  return answer;
}