String Compression II

HardStringDynamic Programming

Solution

export function getLengthOfOptimalCompression(s: string, k: number): number {
  function initArray(n: number, fillValue?: number) {
    return new Array(n).fill(fillValue);
  }
 
  function getCharCode(char: string) {
    return char.charCodeAt(0) - 'a'.charCodeAt(0);
  }
 
  function caculateLength(count: number) {
    if (count === 0) return 0;
    if (count === 1) return 1;
    if (count < 10) return 2;
    if (count < 100) return 3;
    return 4;
  }
 
  const n = s.length;
  const dp = initArray(n).map(() =>
    initArray(26).map(() => initArray(n + 1).map(() => initArray(k + 1, Number.MAX_SAFE_INTEGER))),
  );
 
  function dynamicProgramming(i: number, char: number, count: number, k: number): number {
    if (i === s.length) {
      return caculateLength(count);
    }
    if (dp[i][char][count][k] != Number.MAX_SAFE_INTEGER) {
      return dp[i][char][count][k];
    }
 
    const nextChar = getCharCode(s[i]);
    if (0 < k) {
      dp[i][char][count][k] = dynamicProgramming(i + 1, char, count, k - 1);
    }
    if (char === nextChar) {
      dp[i][char][count][k] = Math.min(
        dp[i][char][count][k],
        dynamicProgramming(i + 1, char, count + 1, k),
      );
    } else {
      dp[i][char][count][k] = Math.min(
        dp[i][char][count][k],
        caculateLength(count) + dynamicProgramming(i + 1, nextChar, 1, k),
      );
    }
    return dp[i][char][count][k];
  }
 
  return dynamicProgramming(0, 0, 0, k);
}