Description
You are given two 0-indexed strings source and target, both of length n and consisting of lowercase English letters. You are also given two 0-indexed character arrays original and changed, and an integer array cost, where cost[i] represents the cost of changing the character original[i] to the character changed[i].
You start with the string source. In one operation, you can pick a character x from the string and change it to the character y at a cost of z if there exists any index j such that cost[j] == z, original[j] == x, and changed[j] == y.
Return the minimum cost to convert the string source to the string target using any number of operations. If it is impossible to convert source to target, return -1.
Note that there may exist indices i, j such that original[j] == original[i] and changed[j] == changed[i].
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 <= 105source,targetconsist of lowercase English letters.1 <= cost.length == original.length == changed.length <= 2000original[i],changed[i]are lowercase English letters.1 <= cost[i] <= 106original[i] != changed[i]
Solutions
This code solves the minimum string transformation cost problem using the Floyd-Warshall shortest-path algorithm. It constructs a 26×26 cost matrix where each cell [i][j] represents the minimum cost to transform character i to character j, using Math.min() to keep the cheapest option when multiple transformations exist for the same pair. After building this matrix, Floyd-Warshall is applied to find the lowest cost paths that may use intermediate characters as stepping stones. Then the algorithm scans through each position in the source string, and if a character differs from the target, it adds the corresponding transformation cost from the matrix—returning -1 if any character transformation is impossible (cost remains Infinity), otherwise returning the total accumulated cost.
/**
* @param {string} source
* @param {string} target
* @param {character[]} original
* @param {character[]} changed
* @param {number[]} cost
* @return {number}
*/
var minimumCost = function(source, target, original, changed, cost) {
let aCode = "a".charCodeAt(0);
const map = Array(26).fill().map(() => Array(26).fill(Infinity));
for (let i = 0; i < original.length; i++) {
const from = original[i].charCodeAt(0) - aCode;
const to = changed[i].charCodeAt(0) - aCode;
map[from][to] = Math.min(map[from][to], cost[i]);
}
for (let k = 0; k < 26; k++) {
for (let i = 0; i < 26; i++) {
for (let j = 0; j < 26; j++) {
if (map[i][j] > map[i][k] + map[k][j]) {
map[i][j] = map[i][k] + map[k][j];
}
}
}
}
let total = 0;
for (let i = 0; i < source.length; i++) {
if (source[i] === target[i]) {
continue;
}
const co = map[source.charCodeAt(i) - aCode][target.charCodeAt(i) - aCode];
if (co === Infinity) {
return -1;
}
total += co;
}
return total;
};