lc-go/solutions/29/q2976/solution.go
2026-02-01 14:48:00 +09:00

51 lines
1.1 KiB
Go

package q2976
import "math"
const INF int = math.MaxInt
func minimumCost(source string, target string, original []byte, changed []byte, cost []int) int64 {
mat := make([][]int, 26)
for i := range mat {
mat[i] = make([]int, 26)
mat[0][i] = INF
}
for i := 1; i < 26; i++ {
copy(mat[i], mat[0])
}
q := make([][3]int, 0, 2*len(original)) // src, dst, cost
for i := range original {
src, dst, cst := int(original[i]-'a'), int(changed[i]-'a'), cost[i]
q = append(q, [3]int{src, dst, cst})
mat[src][dst] = min(mat[src][dst], cst)
}
for ; len(q) > 0; q = q[1:] {
src, dst, cst := q[0][0], q[0][1], q[0][2]
for next := range mat {
if next == src || mat[dst][next] == INF {
continue
}
nextCost := mat[dst][next] + cst
if nextCost < mat[src][next] {
mat[src][next] = nextCost
q = append(q, [3]int{src, next, nextCost})
}
}
}
minTotalCost := 0
for i := range len(source) {
if source[i] != target[i] {
src, dst := source[i]-'a', target[i]-'a'
if mat[src][dst] == INF {
return -1
}
minTotalCost += mat[src][dst]
}
}
return int64(minTotalCost)
}
var _ = minimumCost