go: add «72. Edit Distance»

Signed-off-by: Matej Focko <me@mfocko.xyz>
This commit is contained in:
Matej Focko 2024-08-05 00:03:44 +02:00
parent bb796ab51f
commit d36f1554da
Signed by: mfocko
GPG key ID: 7C47D46246790496

60
go/edit-distance.go Normal file
View file

@ -0,0 +1,60 @@
package main
const UNSET int = -1
type Solver struct {
word1 string
word2 string
dp [][]int
}
func makeSolver(word1, word2 string) Solver {
dp := make([][]int, len(word1))
for i := range len(word1) {
dp[i] = make([]int, len(word2))
for j := range len(word2) {
dp[i][j] = UNSET
}
}
return Solver{
word1: word1,
word2: word2,
dp: dp,
}
}
func (s *Solver) solve(i, j int) int {
if i >= len(s.word1) {
return len(s.word2) - j
}
if j >= len(s.word2) {
return len(s.word1) - i
}
if s.dp[i][j] != UNSET {
return s.dp[i][j]
}
if s.word1[i] == s.word2[j] {
s.dp[i][j] = s.solve(i+1, j+1)
} else {
inserting := 1 + s.solve(i, j+1)
deleting := 1 + s.solve(i+1, j)
replacing := 1 + s.solve(i+1, j+1)
s.dp[i][j] = min(inserting, min(deleting, replacing))
}
return s.dp[i][j]
}
func (s *Solver) Solve() int {
return s.solve(0, 0)
}
func minDistance(word1 string, word2 string) int {
solver := makeSolver(word1, word2)
return solver.Solve()
}