代码随想录二刷Day56
今日任务
583.两个字符串的删除操作
72.编辑距离
语言:Go
583. 两个字符串的删除操作
链接:https://leetcode.cn/problems/delete-operation-for-two-strings/
func max(i, j int) int {
if i < j {
return j
} else {
return i
}
}
func minDistance(word1 string, word2 string) int {
//删除的最小步数-最大公共子序列长度
//dp[i][j]表示以word1[i]结尾的字符串和以word2[j]结尾的字符串
//最大公共子序列长度为dp[i][j]
dp := make([][]int, len(word1))
for i := 0; i < len(word1); i++ {
dp[i] = make([]int, len(word2))
}
for i := 0; i < len(word2); i++ {
if word1[0] == word2[i] {
for j := i; j < len(word2); j++ {
dp[0][j] = 1
}
break
}
}
for i := 0; i < len(word1); i++ {
if word2[0] == word1[i] {
for j := i; j < len(word1); j++ {
dp[j][0] = 1
}
break
}
}
for i := 1; i < len(word1); i++ {
for j := 1; j < len(word2); j++ {
if word1[i] == word2[j] {
dp[i][j] = dp[i - 1][j - 1] + 1
} else {
dp[i][j] = max(dp[i][j - 1], dp[i - 1][j])
}
}
}
return len(word1) + len(word2) - 2 * dp[len(word1) - 1][len(word2) - 1]
}
72. 编辑距离
链接:https://leetcode.cn/problems/edit-distance/
func min(i, j int) int {
if i < j {
return i
} else {
return j
}
}
func minDistance(word1 string, word2 string) int {
if len(word1) == 0 && len(word2) == 0 {
return 0
} else if len(word1) == 0 {
return len(word2)
} else if len(word2) == 0 {
return len(word1)
}
//dp[i][j]表示以word1[i]结尾的字符串和以word2[j]结尾的字符串
//最小编辑距离为dp[i][j]
dp := make([][]int, len(word1))
for i := 0; i < len(word1); i++ {
dp[i] = make([]int, len(word2))
}
if word1[0] != word2[0] {
dp[0][0] = 1
}
for i := 1; i < len(word2); i++ {
if word1[0] != word2[i] {
dp[0][i] = dp[0][i - 1] + 1
} else {
dp[0][i] = min(i, dp[0][i - 1] + 1)
}
}
for i := 1; i < len(word1); i++ {
if word2[0] != word1[i] {
dp[i][0] = dp[i - 1][0] + 1
} else {
dp[i][0] = min(i, dp[i - 1][0] + 1)
}
}
for i := 1; i < len(word1); i++ {
for j := 1; j < len(word2); j++ {
if word1[i] == word2[j] {
dp[i][j] = dp[i - 1][j - 1]
} else {
//word2删除一个元素相当于word1插入一个元素
// 替换 删除 插入
dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])) + 1
}
}
}
return dp[len(word1) - 1][len(word2) - 1]
}