版权声明:原创部分都是自己总结的,如果转载请指明出处。觉得有帮助的老铁,请双击666! https://blog.csdn.net/qq_36387683/article/details/82147601
119. 编辑距离
给出两个单词word1和word2,计算出将word1 转换为word2的最少操作次数。
你总共三种操作方法:
- 插入一个字符
- 删除一个字符
- 替换一个字符
样例
给出 work1="mart" 和 work2="karma"
返回 3
解题思路:
分析:采用动态规划解题,初始化dp字典,dp=[(i-n, j-n), (i, j) ],dp[(i, j)]表示到word1下标为i,word2下标为j时的最小编辑距离。
当i=0时,dp[(0,j)]=j,j=0....len(word2),表示word2需要删除j位来使其与word1相同为空;同理当j=0,dp[(i,0)]=i,i=0,...,len(word1)。
- 对于末尾字符相同:dp[(i, j)]= dp[(i-1, j-1)],表示都看前一位
- 对于末尾字符不同:
2.1 修改某个字符串的最后一位使它们相同:dp[(i, j)]=dp[(i-1, j-1)]+1
2.2 在word1后插入word2末尾字符或直接删除word2末尾:dp[(i, j)]=dp[(i-1, j)]+1
2.3 在word2后插入word1末尾字符或直接删除word1末尾:dp[(i, j)]=dp[(i, j-1)]+1
即,dp[(i,j)]=min(dp[(i-1, j-1)],dp[(i-1, j)],dp[(i, j-1)]) + 1。
最后返回dp[(len(word1, len(word2)))]即可。
class Solution:
"""
@param word1: A string
@param word2: A string
@return: The minimum number of steps.
"""
def minDistance(self, word1, word2):
# write your code here
m, n = len(word1), len(word2)
self.dp = {}
return self.helper(m, n, word1, word2)
def helper(self, i, j, word1, word2):
if (i, j) in self.dp:
return self.dp[(i, j)]
#如果其中一个为空,另一个要删除自身长度来达到空
if i == 0:
self.dp[(i, j)] = j
return j
elif j == 0:
self.dp[(i, j)] = i
return i
#如果两个字符的末尾字符相同,就向前看一位
if word1[i-1] == word2[j-1]:
self.dp[(i, j)] = self.helper(i-1, j-1, word1, word2)
return self.dp[(i, j)]
'''
对于末尾字符不同:
2.1 修改某个字符串的最后一位使它们相同:dp[i][j]=dp[i-1][j-1]+1
2.2 在word1后插入word2末尾字符或直接删除word2末尾:dp[i][j]=dp[i][j-1]+1
2.3 在word2后插入word1末尾字符或直接删除word1末尾:dp[i][j]=dp[i-1][j]+1
'''
else:
self.dp[(i, j)] = min(self.helper(i-1, j-1, word1, word2),
self.helper(i-1, j, word1, word2),
self.helper(i, j-1, word1, word2)) + 1
return self.dp[(i, j)]