编辑距离问题
题目可转变为求最长公共子序列长度
class Solution:
# 求最长公共子序列长度
def minDistance(self, word1: str, word2: str) -> int:
m, n = len(word1), len(word2)
dp = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(1, m + 1):
for j in range(1, n + 1):
if word1[i - 1] == word2[j - 1]:
dp[i][j] = dp[i - 1][j - 1] + 1
else:
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1])
return m + n - 2*dp[-1][-1]
1、含义:dp[i][j]表示以word1[i-1] word2[j-1]结尾的单词的最近编辑距离
2、递推:
① word1[i-1] == word2[j-1]:不操作 dp[i][j] = dp[i-1][j-1]
② word1[i-1] != word2[j-1]:
操作一:word1删除一个字符:dp[i][j] = dp[i-1][j] + 1
操作二:word1添加一个字符 == word2删除一个字符:dp[i][j] = dp[i][j-1] + 1
操作三:word1替换一个字符(替换成word2[j-1]):dp[i][j] = dp[i-1][j-1] + 1
3、初始化:dp[i][0] = i, dp[0][j] = j
class Solution:
# 1、含义:dp[i][j]表示以word1[i-1] word2[j-1]结尾的单词的最近编辑距离
# 2、递推:
# ① word1[i-1] == word2[j-1]:不操作 dp[i][j] = dp[i-1][j-1]
# ② word1[i-1] != word2[j-1]:
# 操作一:word1删除一个字符:dp[i][j] = dp[i-1][j] + 1
# 操作二:word1添加一个字符 == word2删除一个字符:dp[i][j] = dp[i][j-1] + 1
# 操作三:word1替换一个字符(替换成word2[j-1]):dp[i][j] = dp[i-1][j-1] + 1
# 3、初始化:dp[i][0] = i, dp[0][j] = j
def minDistance(self, word1: str, word2: str) -> int:
m, n = len(word1),len(word2)
dp = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(m + 1):
dp[i][0] = i
for j in range(n + 1):
dp[0][j] = j
for i in range(1, m + 1):
for j in range(1, n + 1):
if word1[i - 1] == word2[j - 1]:
dp[i][j] = dp[i - 1][j - 1]
else:
dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1
return dp[-1][-1]