go: add «72. Edit Distance»
Signed-off-by: Matej Focko <me@mfocko.xyz>
This commit is contained in:
parent
bb796ab51f
commit
d36f1554da
1 changed files with 60 additions and 0 deletions
60
go/edit-distance.go
Normal file
60
go/edit-distance.go
Normal 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()
|
||||||
|
}
|
Loading…
Reference in a new issue