lintcode练习- 119. 编辑距离

版权声明:原创部分都是自己总结的,如果转载请指明出处。觉得有帮助的老铁,请双击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)。

  1. 对于末尾字符相同:dp[(i, j)]= dp[(i-1, j-1)],表示都看前一位
  2. 对于末尾字符不同:

           2.1 修改某个字符串的最后一位使它们相同:dp[(i, j)]=dp[(i-1, j-1)]+1

           2.2 在word1后插入word2末尾字符或直接删除word2末尾:dp[(i, j)]=dp[(i-1, j)]+1

扫描二维码关注公众号,回复: 2980285 查看本文章

           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)]

猜你喜欢

转载自blog.csdn.net/qq_36387683/article/details/82147601
今日推荐