{x}
blog image

Strange Printer

There is a strange printer with the following two special properties:

  • The printer can only print a sequence of the same character each time.
  • At each turn, the printer can print new characters starting from and ending at any place and will cover the original existing characters.

Given a string s, return the minimum number of turns the printer needed to print it.

 

Example 1:

Input: s = "aaabbb"
Output: 2
Explanation: Print "aaa" first and then print "bbb".

Example 2:

Input: s = "aba"
Output: 2
Explanation: Print "aaa" first and then print "b" from the second place of the string, which will cover the existing character 'a'.

 

Constraints:

  • 1 <= s.length <= 100
  • s consists of lowercase English letters.

664. Strange Printer

Problem Description

The problem involves a strange printer that can only print sequences of the same character at a time. It can overwrite existing characters. Given a string s, the goal is to find the minimum number of printing operations needed to reproduce s.

Solution: Dynamic Programming

The optimal solution utilizes dynamic programming. We create a 2D array f where f[i][j] represents the minimum number of printing operations needed to print the substring s[i...j].

State Transition:

The core logic lies in the state transition equation. We consider three cases:

  1. Base Case: If i == j, it means a single character substring, requiring only one operation. f[i][i] = 1

  2. Same Characters: If s[i] == s[j], we can print the entire substring in the same operation as printing s[i...j-1]. This is because we can print s[j] simultaneously while printing the preceding characters. Thus f[i][j] = f[i][j-1]

  3. Different Characters: If s[i] != s[j], we need to split the substring into two parts. We consider all possible split points k between i and j (inclusive). The minimum number of operations will be the minimum of f[i][k] + f[k+1][j] across all possible k values. This captures the cost of printing the two resulting sub-strings separately.

Initialization and Order of Calculation:

We initialize the diagonal of f (representing single-character substrings) to 1. We then iterate through the f array in a specific order: outer loop iterates from the end of the string to the beginning (decreasing i), and the inner loop iterates from i+1 to the end of the string (increasing j). This ensures that f[i][k] and f[k+1][j] are already computed before calculating f[i][j].

Time and Space Complexity:

  • Time Complexity: O(n³), where n is the length of the string. The nested loops iterate through all possible sub-strings and split points.
  • Space Complexity: O(n²), due to the 2D DP array f.

Code Implementation (Python)

class Solution:
    def strangePrinter(self, s: str) -> int:
        n = len(s)
        f = [[float('inf')] * n for _ in range(n)]  # Initialize with infinity
 
        for i in range(n):
            f[i][i] = 1  # Base case: single character
 
        for i in range(n - 1, -1, -1):
            for j in range(i + 1, n):
                if s[i] == s[j]:
                    f[i][j] = f[i][j - 1]  # Same character case
                else:
                    for k in range(i, j):
                        f[i][j] = min(f[i][j], f[i][k] + f[k + 1][j])  # Different character case
 
        return f[0][n - 1]  # Result is the minimum operations for the entire string
 

The implementations in other languages (Java, C++, Go, TypeScript) follow a similar structure, adapting the syntax and data structures to the respective language. The core DP logic remains consistent.