编辑距离,增删改
'''
分析:
自顶向下分析:
w1[0...i]变到 w2[0...j]
(1)若w1需要增添一个元素,那么接下来需要比较w1[0...i]->w2[0...j-1]
(2)若w1需要改最后一个元素, 那么接下来需要比较w1[0...i-1]->w2[0...j-1]
(3)若w1需要删最后一个元素,那么接下来需要比较w1[0...i-1]->w2[0...j]
res = min(f1,f2,f3)+1
任何的子问题,可以自顶向下的递归和自底向上的动态规划解决
首先递归:
代码上有三种情况:
1.w1和w2有一个为空,则返回另一个的长度
2.最后一位相同,则返回w1[:-1] w2[:-1]
3.最后一位不同,则返回min(f1, f2, f3)+1
结果递归超时,因为很多重复计算,所以需要考虑动态规划保存结果
动态规划:
由于w1和w2是两个状态,所以需要二维数组
'''
def minDistance(word1: str, word2: str) -> int:
dp = [[0 for j in range(len(word2)+1)] for i in range(len(word1)+1)]
for i in range(len(word1)+1):
for j in range(len(word2)+1):
if i == 0 and j == 0:
dp[i][j] = 0
elif i == 0 or j == 0:
dp[i][j] = max(i, j)
elif word1[i-1] == word2[j-1]:
dp[i][j] = dp[i-1][j-1]
else:
dp[i][j] = 1+min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1])
return dp[len(word1)][len(word2)] if dp else 0
print(minDistance('intention', 'execution'))