Minimum Cost to Convert String I

Updated on 17 June, 2025
Minimum Cost to Convert String I header image

Problem Statement

In the given problem, you have two equal-length strings named source and target, both comprising solely of lowercase English letters. Alongside these strings, you are provided with two character arrays original and changed, and an integer array cost. Each element in cost defines the expenditure required to transform a character from the original array to its corresponding character in the changed array at the same index.

You are tasked to determine the minimum cost to modify the source string into the target string using the specified character transformations. If a transformation is necessary for which there is no specified cost or possibility under the given arrays, the function should return -1. This task encourages finding an efficient method to track and calculate the lowest cost of multiple possible character transformations among strings.

Examples

Example 1

Input:

source = "abcd", target = "acbe", original = ["a","b","c","c","e","d"], changed = ["b","c","b","e","b","e"], cost = [2,5,5,1,2,20]

Output:

28

Explanation:

To convert the string "abcd" to string "acbe":
- Change value at index 1 from 'b' to 'c' at a cost of 5.
- Change value at index 2 from 'c' to 'e' at a cost of 1.
- Change value at index 2 from 'e' to 'b' at a cost of 2.
- Change value at index 3 from 'd' to 'e' at a cost of 20.
The total cost incurred is 5 + 1 + 2 + 20 = 28.
It can be shown that this is the minimum possible cost.

Example 2

Input:

source = "aaaa", target = "bbbb", original = ["a","c"], changed = ["c","b"], cost = [1,2]

Output:

12

Explanation:

To change the character 'a' to 'b' change the character 'a' to 'c' at a cost of 1, followed by changing the character 'c' to 'b' at a cost of 2, for a total cost of 1 + 2 = 3. To change all occurrences of 'a' to 'b', a total cost of 3 * 4 = 12 is incurred.

Example 3

Input:

source = "abcd", target = "abce", original = ["a"], changed = ["e"], cost = [10000]

Output:

-1

Explanation:

It is impossible to convert source to target because the value at index 3 cannot be changed from 'd' to 'e'.

Constraints

  • 1 <= source.length == target.length <= 105
  • source, target consist of lowercase English letters.
  • 1 <= cost.length == original.length == changed.length <= 2000
  • original[i], changed[i] are lowercase English letters.
  • 1 <= cost[i] <= 106
  • original[i] != changed[i]

Approach and Intuition

To tackle the problem of transforming the source string to the target string with minimum cost, a strategic approach mixing string manipulation and cost optimization is essential. The following steps outline an intuitive way to approach the problem:

  1. Create a mapping from each character in original to its corresponding changed character along with the cost. If multiple costs exist for the same transformation, only the minimum cost should be stored.
  2. Iterate through each character of source and target simultaneously.
    • If the current characters are the same, move to the next character.
    • If they differ, find the corresponding transformation in the mapping.
      • If the transformation is found and is feasible, accumulate its cost.
      • If no such transformation exists or is exorbitantly priced making another route comparatively cheaper (which you'd need to have precalculated or dynamically parse), mark as impossible.
  3. Calculate the total transformation cost based on the feasible mappings and compare various transformation pathways if multiple exist for a single character transformation.
  4. If at any point a required transformation is not present in the mapping, instantly return -1 implying transformation impossibility.
  5. At the end of the iteration, if all transformations are successful and the accumulated cost is minimal compared to other potential transformation paths, return the total cost.

This approach ensures that the transformation is not only possible but also done at the minimal possible cost by leveraging the given cost structures and available transformations. Additionally, edge cases like multiple transformations available for a single character change need careful consideration for cost-effectiveness.

Solutions

  • C++
  • Java
  • Python
cpp
class Solution {
public:
    long long transformCost(string src, string dest, vector<char>& from,
                            vector<char>& to, vector<int>& costs) {
        long long minTotalCost = 0;
        vector<vector<long long>> transformationCost(26, vector<long long>(26, INT_MAX));

        for (int idx = 0; idx < from.size(); ++idx) {
            int origCharIdx = from[idx] - 'a';
            int newCharIdx = to[idx] - 'a';
            transformationCost[origCharIdx][newCharIdx] =
                min(transformationCost[origCharIdx][newCharIdx], (long long)costs[idx]);
        }
        
        for (int k = 0; k < 26; ++k) {
            for (int i = 0; i < 26; ++i) {
                for (int j = 0; j < 26; ++j) {
                    transformationCost[i][j] =
                        min(transformationCost[i][j], transformationCost[i][k] + transformationCost[k][j]);
                }
            }
        }

        for (int idx = 0; idx < src.size(); ++idx) {
            if (src[idx] == dest[idx]) {
                continue;
            }
            int srcChar = src[idx] - 'a';
            int destChar = dest[idx] - 'a';

            if (transformationCost[srcChar][destChar] == INT_MAX) {
                return -1;
            }
            minTotalCost += transformationCost[srcChar][destChar];
        }

        return minTotalCost;
    }
};

The provided C++ code defines a method in a class for calculating the minimum cost to transform one string (src) into another string (dest) using given transformations. Each transformations costs a certain amount, and you need to determine the minimum total cost to achieve the conversion.

Here's a breakdown of the solution:

  • The method transformCost takes two strings src and dest, along with three vectors from, to, and costs which represent transformation rules and their respective costs.
  • First, a 2D vector transformationCost is initialized to store the minimum cost for converting each character to every other character, using INT_MAX as the initial value indicating no direct transformation available.
  • It then populates the transformationCost matrix with the costs provided, making sure to store the minimum cost for direct transformations (from vector from to vector to).
  • The code uses the Floyd-Warshall algorithm to compute the minimum cost between every pair of characters, thereby handling sequences of transformations efficiently.
  • After computing all possible transformation paths and their costs, the code iterates over the src and dest strings. If characters are different, it fetches the transformation cost.
  • If any transformation cost from src character to dest character is still INT_MAX (no possible transformation), the function returns -1 indicating the transformation cannot be completed with the given rules.
  • Otherwise, it accumulates the transformation costs for all differing character positions to calculate the minTotalCost.
  • Finally, the function returns the minTotalCost.

This ensures the minimal possible cost is calculated for converting the entire src string to dest string based on the given character transformations. If any transformation is impossible, the function appropriately returns -1.

java
class Solution {

    public long calculateMinimumCost(
        String src,
        String dst,
        char[] fromChars,
        char[] toChars,
        int[] costs
    ) {
        long sumCost = 0;

        long[][] costsMatrix = new long[26][26];
        for (long[] row : costsMatrix) {
            Arrays.fill(row, Integer.MAX_VALUE);
        }

        for (int i = 0; i < fromChars.length; ++i) {
            int origin = fromChars[i] - 'a';
            int destination = toChars[i] - 'a';
            costsMatrix[origin][destination] = Math.min(
                costsMatrix[origin][destination],
                (long) costs[i]
            );
        }

        for (int k = 0; k < 26; ++k) {
            for (int i = 0; i < 26; ++i) {
                for (int j = 0; j < 26; ++j) {
                    costsMatrix[i][j] = Math.min(
                        costsMatrix[i][j],
                        costsMatrix[i][k] + costsMatrix[k][j]
                    );
                }
            }
        }

        for (int i = 0; i < src.length(); ++i) {
            if (src.charAt(i) == dst.charAt(i)) {
                continue;
            }
            int origin = src.charAt(i) - 'a';
            int destination = dst.charAt(i) - 'a';

            if (costsMatrix[origin][destination] >= Integer.MAX_VALUE) {
                return -1;
            }
            sumCost += costsMatrix[origin][destination];
        }

        return sumCost;
    }
}

This Java solution implements a method to find the minimum cost required to convert one string to another given a set of characters transformations and their associated costs. The steps involved include:

  1. Initialize a 2D cost matrix to represent the cost of converting each letter of the alphabet to another with an initial high cost (assumed infinite).
  2. Update the matrix with the minimum transformation costs provided.
  3. Utilize the Floyd-Warshall algorithm to compute the shortest path for all pairs, ensuring that the matrix represents the cheapest way to convert any character to another.
  4. Calculate the total cost for converting string src to string dst by iterating through their characters and summing up the specific transformation costs. If the transformation is not possible, return -1 to indicate failure.

Key operations within the method include:

  • Filling a 2D array with initial maximum values for costs.
  • Adjusting costs in the cost matrix based on the character mappings and their costs.
  • Using an iteration approach to minimize the cost for every pair of characters using the Floyd-Warshall algorithm.
  • Accumulating the total cost or returning failure if the transformation cannot be applied.

The implementation ensures the returned value is the lowest possible cost to transform the entire src string into the dst string, using any legal series of character transformations. If there exists any character in src that cannot be converted to its corresponding character in dst, the method promptly returns -1.

python
class Solution:
    def minTransformationCost(
        self,
        src: str,
        dest: str,
        before: List[str],
        after: List[str],
        prices: List[int],
    ) -> int:
        # Total cost calculation
        accumulated_cost = 0

        # Minimum costs matrix using list comprehension
        min_costs = [[float("inf")] * 26 for _ in range(26)]

        # Populate the transformation costs
        for ori, mod, price in zip(before, after, prices):
            ori_index = ord(ori) - ord("a")
            mod_index = ord(mod) - ord("a")
            min_costs[ori_index][mod_index] = min(
                min_costs[ori_index][mod_index], price
            )

        # Optimize cost paths with Floyd-Warshall algorithm
        for k in range(26):
            for i in range(26):
                for j in range(26):
                    min_costs[i][j] = min(
                        min_costs[i][j], min_costs[i][k] + min_costs[k][j]
                    )

        # Total minimum cost for transformation
        for s_char, t_char in zip(src, dest):
            if s_char == t_char:
                continue
            src_index = ord(s_char) - ord("a")
            tgt_index = ord(t_char) - ord("a")

            # If not transformable, return -1
            if min_costs[src_index][tgt_index] == float("inf"):
                return -1
            accumulated_cost += min_costs[src_index][tgt_index]

        return accumulated_cost

Solution Summary:

The provided Python code defines a function to calculate the minimum cost required to transform one string (src) into another string (dest). The transformation rules and their corresponding costs are provided through before, after, and prices lists.

  • Initialize the total cost and create a cost matrix for all characters from a to z. Each entry initially is set to infinity, representing a high undefined cost.
  • Populate the matrix with actual costs by iterating over the provided transformation rules.
  • Optimize the transformation path using the Floyd-Warshall algorithm to find the cheapest way to transform any given character to any other using the direct or intermediary transformations.
  • Calculate the accumulated cost for transforming the src string to the dest string, character by character:
    • If direct transformation cost exists, add it to the total.
    • If a character cannot be transformed (has a cost of infinity), return -1 to indicate impossibility.
  • Return the total accumulated cost.

This solution effectively handles the task by utilizing dynamic programming for cost optimization and matrix manipulation. The Floyd-Warshall algorithm is crucial for computing the shortest paths in the cost matrix, while the transformations directly tie back to specific costs, ensuring that the minimum overall cost is calculated.

Comments

No comments yet.