AcWing 902. 最短编辑距离-代码注释-golang
原题链接
简单
作者:
望哥
,
2020-07-24 23:35:58
,
所有人可见
,
阅读 716
package main
import (
"bufio"
"fmt"
"os"
)
const (
N = 1010
)
var dp [N][N]int
var reader = bufio.NewReader(os.Stdin)
var writer = bufio.NewWriter(os.Stdout)
var n,m int
func min(a,b int)int{
if a>b{
return b
}
return a
}
func main() {
var a,b string
fmt.Fscan(reader, &n, &a, &m, &b)
// - **最短编辑距离**: a, b 两个序列, `dp[i][j]` 表示从 `a[0~i]` 变为 `b[0~j]` 所需的最小编辑次数; 编辑方式包括增、删、改一个字符。
// 状态计算分4种情况, `dp[i][j]` 取4种情况最小值:
// - 增: `dp[i][j] = dp[i][j-1] + 1`, 表示在`dp[i][j-1]`基础上 a要增加一个和b[j]一样的字符
// - 删: `dp[i][j] = dp[i-1][j] + 1`, 表示在`dp[i-1][j]`基础上 a要删除a[i]使得两个字符一致
// - 改: `dp[i][j] = dp[i-1][j-1] +1`, 其中 `a[i]!=b[j]`, 表示在`dp[i-1][j-1]`基础上 a要修改a[i]为b[j]一样的字符。
// - 改: `dp[i][j] = dp[i-1][j-1]`, 其中 `a[i]==b[j]`, 表示在`dp[i-1][j-1]`基础上 a不需要做任何编辑。
// 注意需要初始化:
// - 初始化 `dp[1~i][0] = i`, 表示a需要做i次删除才能变为空
// - 初始化 `dp[0][1~j] = j`, 表示空a需要做j次增加才能变为b
for i:=1;i<=n;i++{
dp[i][0] = i
}
for j:=1;j<=m;j++{
dp[0][j] = j
}
for i := 1; i <= n; i++ {
for j:=1;j<=m;j++{
dp[i][j] = min(dp[i][j-1] + 1, dp[i-1][j] + 1)
if a[i-1] == b[j-1] {
dp[i][j] = min(dp[i][j], dp[i-1][j-1])
}else{
dp[i][j] = min(dp[i][j], dp[i-1][j-1] + 1)
}
}
}
fmt.Println(dp[n][m])
}