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 zif 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 convertsourcetotarget, 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 <= 105
source, target consist of lowercase English letters.
original[i], changed[i] are lowercase English letters.
1 <= cost[i] <= 106
original[i] != changed[i]
Solutions
Solution 1: Floyd Algorithm
According to the problem description, we can consider each letter as a node, and the conversion cost between each pair of letters as a directed edge. We first initialize a \(26 \times 26\) two-dimensional array \(g\), where \(g[i][j]\) represents the minimum cost of converting letter \(i\) to letter \(j\). Initially, \(g[i][j] = \infty\), and if \(i = j\), then \(g[i][j] = 0\).
Next, we traverse the arrays \(original\), \(changed\), and \(cost\). For each index \(i\), we update the cost \(cost[i]\) of converting \(original[i]\) to \(changed[i]\) to \(g[original[i]][changed[i]]\), taking the minimum value.
Then, we use the Floyd algorithm to calculate the minimum cost between any two nodes in \(g\). Finally, we traverse the strings \(source\) and \(target\). If \(source[i] \neq target[i]\) and \(g[source[i]][target[i]] \geq \infty\), it means that the conversion cannot be completed, so we return \(-1\). Otherwise, we add \(g[source[i]][target[i]]\) to the answer.
After the traversal ends, we return the answer.
The time complexity is \(O(m + n + |\Sigma|^3)\), and the space complexity is \(O(|\Sigma|^2)\). Where \(m\) and \(n\) are the lengths of the arrays \(original\) and \(source\) respectively; and \(|\Sigma|\) is the size of the alphabet, that is, \(|\Sigma| = 26\).