Bird
Raised Fist0
DSA Typescriptprogramming~10 mins

Palindrome Partitioning Using Backtracking in DSA Typescript - Interactive Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to check if a substring is a palindrome.

DSA Typescript
function isPalindrome(s: string, left: number, right: number): boolean {
  while (left < right) {
    if (s[left] !== s[1]) {
      return false;
    }
    left++;
    right--;
  }
  return true;
}
Drag options to blanks, or click blank then click option'
A(right)
B[left]
C[right]
D(left)
Attempts:
3 left
💡 Hint
Common Mistakes
Using parentheses instead of brackets for string indexing.
Comparing s[left] with s[left] instead of s[right].
2fill in blank
medium

Complete the code to add a substring to the current partition.

DSA Typescript
function backtrack(start: number, s: string, currentPartition: string[], result: string[][]): void {
  if (start === s.length) {
    result.push([...currentPartition]);
    return;
  }
  for (let end = start; end < s.length; end++) {
    if (isPalindrome(s, start, end)) {
      currentPartition.[1](s.substring(start, end + 1));
      backtrack(end + 1, s, currentPartition, result);
      currentPartition.pop();
    }
  }
}
Drag options to blanks, or click blank then click option'
Apush
Bpop
Cslice
Dsplice
Attempts:
3 left
💡 Hint
Common Mistakes
Using pop instead of push to add elements.
Using slice or splice which do not add elements.
3fill in blank
hard

Fix the error in the base case condition to stop recursion correctly.

DSA Typescript
function backtrack(start: number, s: string, currentPartition: string[], result: string[][]): void {
  if (start [1] s.length) {
    result.push([...currentPartition]);
    return;
  }
  for (let end = start; end < s.length; end++) {
    if (isPalindrome(s, start, end)) {
      currentPartition.push(s.substring(start, end + 1));
      backtrack(end + 1, s, currentPartition, result);
      currentPartition.pop();
    }
  }
}
Drag options to blanks, or click blank then click option'
A<=
B<
C>
D===
Attempts:
3 left
💡 Hint
Common Mistakes
Using less than or greater than instead of equality.
Using <= or >= which may cause incorrect recursion.
4fill in blank
hard

Fill both blanks to complete the main function that starts backtracking.

DSA Typescript
function partition(s: string): string[][] {
  const result: string[][] = [];
  const currentPartition: string[] = [];
  backtrack([1], s, currentPartition, result);
  return [2];
}
Drag options to blanks, or click blank then click option'
A0
Bresult
Cs.length
DcurrentPartition
Attempts:
3 left
💡 Hint
Common Mistakes
Starting from s.length which skips processing.
Returning currentPartition instead of result.
5fill in blank
hard

Fill all three blanks to complete the palindrome partitioning code with backtracking.

DSA Typescript
function isPalindrome(s: string, left: number, right: number): boolean {
  while (left [1] right) {
    if (s[left] !== s[right]) {
      return false;
    }
    left++;
    right--;
  }
  return true;
}

function backtrack(start: number, s: string, currentPartition: string[], result: string[][]): void {
  if (start === s.length) {
    result.push([...currentPartition]);
    return;
  }
  for (let end = start; end < s.length; end++) {
    if (isPalindrome(s, start, end)) {
      currentPartition.[2](s.substring(start, end + 1));
      backtrack(end + 1, s, currentPartition, result);
      currentPartition.pop();
    }
  }
}

function partition(s: string): string[][] {
  const result: string[][] = [];
  const currentPartition: string[] = [];
  backtrack([3], s, currentPartition, result);
  return result;
}
Drag options to blanks, or click blank then click option'
A<
Bpush
C0
D<=
Attempts:
3 left
💡 Hint
Common Mistakes
Using <= in while loop causing extra checks.
Using pop instead of push to add substring.
Starting backtracking from 1 instead of 0.

Practice

(1/5)
1. What is the main goal of palindrome partitioning using backtracking?
easy
A. To reverse the string and check if it is a palindrome
B. To find the longest palindrome substring in a string
C. To count the number of palindromes in a string
D. To split a string into all possible palindrome substrings

Solution

  1. Step 1: Understand palindrome partitioning

    Palindrome partitioning means dividing a string into parts where each part is a palindrome.
  2. Step 2: Role of backtracking

    Backtracking helps explore all possible ways to split the string into palindrome parts.
  3. Final Answer:

    To split a string into all possible palindrome substrings -> Option D
  4. Quick Check:

    Palindrome partitioning = all palindrome splits [OK]
Hint: Backtracking explores all palindrome splits step-by-step [OK]
Common Mistakes:
  • Confusing palindrome partitioning with longest palindrome substring
  • Thinking it only counts palindromes instead of listing partitions
  • Assuming it just reverses the string
2. Which of the following TypeScript function signatures correctly represents a backtracking function for palindrome partitioning?
easy
A. function backtrack(s: number[], start: string, path: string[], result: string[][]): string
B. function backtrack(s: string, start: number, path: string, result: string[]): boolean
C. function backtrack(s: string, start: number, path: string[], result: string[][]): void
D. function backtrack(s: string[], start: number, path: string[], result: string[][]): number

Solution

  1. Step 1: Analyze parameter types

    The string to partition is 's: string', start index is 'number', path is an array of strings, and result is an array of string arrays.
  2. Step 2: Check return type

    Backtracking functions usually return void because they build results by modifying the result array.
  3. Final Answer:

    function backtrack(s: string, start: number, path: string[], result: string[][]): void -> Option C
  4. Quick Check:

    Correct signature = function backtrack(s: string, start: number, path: string[], result: string[][]): void [OK]
Hint: Backtracking returns void and uses arrays for path and result [OK]
Common Mistakes:
  • Using wrong parameter types like number[] instead of string
  • Returning boolean or number instead of void
  • Passing path as string instead of string[]
3. What will be the output of the following TypeScript code snippet for palindrome partitioning of string "aab"?
function isPalindrome(s: string): boolean {
  return s === s.split('').reverse().join('');
}

function backtrack(s: string, start: number, path: string[], result: string[][]): void {
  if (start === s.length) {
    result.push([...path]);
    return;
  }
  for (let end = start + 1; end <= s.length; end++) {
    const substr = s.substring(start, end);
    if (isPalindrome(substr)) {
      path.push(substr);
      backtrack(s, end, path, result);
      path.pop();
    }
  }
}

const result: string[][] = [];
backtrack("aab", 0, [], result);
console.log(result);
medium
A. [["aa", "ab"]]
B. [["a", "a", "b"], ["aa", "b"]]
C. [["a", "ab"]]
D. [["aab"]]

Solution

  1. Step 1: Identify palindrome substrings in "aab"

    "a" and "aa" are palindromes; "b" is a palindrome; "ab" and "aab" are not.
  2. Step 2: Trace backtracking calls

    Partitions found are ["a", "a", "b"] and ["aa", "b"] added to result.
  3. Final Answer:

    [["a", "a", "b"], ["aa", "b"]] -> Option B
  4. Quick Check:

    All palindrome splits of "aab" = [["a", "a", "b"], ["aa", "b"]] [OK]
Hint: Check all palindrome substrings and backtrack all splits [OK]
Common Mistakes:
  • Including non-palindrome substrings like "ab"
  • Missing the "aa" substring partition
  • Returning only one partition instead of all
4. Identify the bug in the following backtracking code for palindrome partitioning and select the fix:
function isPalindrome(s: string): boolean {
  return s === s.split('').reverse().join('');
}

function backtrack(s: string, start: number, path: string[], result: string[][]): void {
  if (start > s.length) {
    result.push([...path]);
    return;
  }
  for (let end = start + 1; end <= s.length; end++) {
    const substr = s.substring(start, end);
    if (isPalindrome(substr)) {
      path.push(substr);
      backtrack(s, end, path, result);
      path.pop();
    }
  }
}
medium
A. Change condition to if (start === s.length) to stop recursion correctly
B. Change substring to slice for correct substring extraction
C. Remove path.pop() to keep all partitions
D. Change for loop to end < s.length to avoid out of bounds

Solution

  1. Step 1: Analyze base case condition

    Condition 'start > s.length' allows start to be s.length + 1, which is invalid index.
  2. Step 2: Correct base case for recursion end

    It should be 'start === s.length' to indicate full string processed and add path to result.
  3. Final Answer:

    Change condition to if (start === s.length) to stop recursion correctly -> Option A
  4. Quick Check:

    Base case must be start === s.length [OK]
Hint: Base case triggers when start equals string length [OK]
Common Mistakes:
  • Using > instead of === in base case
  • Removing path.pop() causing wrong partitions
  • Changing substring method unnecessarily
5. Given the string "racecar", which of the following is NOT a valid palindrome partitioning produced by a backtracking algorithm?
hard
A. ["rac", "ecar"]
B. ["racecar"]
C. ["r", "a", "c", "e", "c", "a", "r"]
D. ["r", "aceca", "r"]

Solution

  1. Step 1: Check palindrome validity of each substring

    "rac" and "ecar" are not palindromes; others are single letters or full palindrome.
  2. Step 2: Confirm valid partitions

    Partitions with only palindrome substrings are valid; those with non-palindromes are invalid.
  3. Final Answer:

    ["rac", "ecar"] -> Option A
  4. Quick Check:

    Non-palindrome substrings invalidate partition [OK]
Hint: Check each substring is palindrome to validate partition [OK]
Common Mistakes:
  • Assuming any split is valid without palindrome check
  • Confusing full string palindrome with partial substrings
  • Ignoring single character substrings as palindromes
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard