Strange Printer

HardStringDynamic Programming

Solution

export function strangePrinter(s: string): number {
  const chars = normalize(s);
  const n = chars.length;
  if (n <= 2) {
    return n;
  }
 
  const dp: number[][] = Array.from({ length: n }, () =>
    new Array(n).fill(Number.MAX_SAFE_INTEGER),
  );
  for (let start = n - 1; 0 <= start; start--) {
    dp[start][start] = 1;
    for (let end = start + 1; end < n; end++) {
      for (let mid = start; mid < end; mid++) {
        dp[start][end] = Math.min(dp[start][end], dp[start][mid] + dp[mid + 1][end]);
      }
      if (chars[start] === chars[end]) {
        dp[start][end] -= 1;
      }
    }
  }
 
  return dp[0][n - 1];
}
 
function normalize(s: string): string[] {
  const chars: string[] = [];
  for (const char of s) {
    if (chars.length !== 0 && chars[chars.length - 1] === char) {
      continue;
    }
    chars.push(char);
  }
  return chars;
}

Complexity

  • Time: O(N^3)
  • Space: O(N^2)