Minimum Cost to Convert String I

MediumArrayStringGraphShortest Path

Solution

export function minimumCost(
  source: string,
  target: string,
  original: string[],
  changed: string[],
  cost: number[],
): number {
  const distances = floydWarshall(26, original, changed, cost);
 
  let answer = 0;
  for (let i = 0; i < source.length; i++) {
    const distance = distances[getCharCode(source[i])][getCharCode(target[i])];
    if (distance === Infinity) {
      return -1;
    }
    answer += distance;
  }
  return answer;
}
 
function getCharCode(char: string): number {
  return char.charCodeAt(0) - 'a'.charCodeAt(0);
}
 
function floydWarshall(
  n: number,
  original: string[],
  changed: string[],
  cost: number[],
): number[][] {
  const distances = Array.from({ length: n }, (_, i) =>
    Array.from({ length: n }, (_, j) => (i === j ? 0 : Infinity)),
  );
  for (let i = 0; i < original.length; i++) {
    const from = getCharCode(original[i]);
    const to = getCharCode(changed[i]);
    distances[from][to] = Math.min(distances[from][to], cost[i]);
  }
 
  for (let k = 0; k < n; k++) {
    for (let i = 0; i < n; i++) {
      for (let j = 0; j < n; j++) {
        distances[i][j] = Math.min(distances[i][j], distances[i][k] + distances[k][j]);
      }
    }
  }
  return distances;
}

Complexity

  • Time: O(N+M+26^3)
  • Space: O(26^2)