总结
- 稍微有点儿难度,回头我再总结一下与此题相关的题。
1.题目
题目链接 虽然在LeetCode是道hard题,但是在洛谷也就是一道黄题而已。
2.分析
感觉就是 dp,对吧。
设 dp[i][j]
表示字符串a前i位和字符串b前j位能够完全匹配所需的最少步数。那么当下的每步操作都有三种选择,分别是:插入,删除,替换。我们针对这种情况,进行递推选举一种最小值即可。
比较 a[i] == b[j]
时,递推公式如何…
当 a[i] != b[j]
递推公式如何…
后来可以看到其实二者只有一个子公式是不同的,所以可以将这两种情况再简化一下就得到了最后的综合表达式。
最后对于特殊的边界需要再特殊处理一下即可。这个特殊边界有点儿不好处理。需要注意。
3.代码
根据上述分析,得到的代码如下:
class Solution:
def minDistance(self, word1: str, word2: str) -> int:
m,n = len(word1),len(word2)
if m == 0:
if n == 0:
return 0
else:
return n
if n == 0:
return m
dp = [[0 for i in range(n)] for j in range(m)]
# dp 查找出结果
for i in range(m):
for j in range(n):
# 针对特殊情况进行处理
if i==0 :
a = 0 if j==0 else j-i
b=j+1
else:
if j == 0: # i>0 j==0
a = i-j
else: # i>0 and j>0
a = dp[i-1][j-1]
b = dp[i-1][j]
c = i-j+1 if j == 0 else c = dp[i][j-1]
# 下面才是正式比较
if word1[i] == word2[j] :
dp[i][j] = min(a,b+1)
else:
dp[i][j] = min(a+1,c+1,b+1)
return dp[m-1][n-1]