[Lintcode]119. Edit Distance/[Leetcode]72. Edit Distance

119. Edit Distance/72. Edit Distance

  • 本题难度: Medium/Hard
  • Topic: Dynamic Programming

Description

Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)

You have the following 3 operations permitted on a word:

Insert a character
Delete a character
Replace a character
Example
Given word1 = "mart" and word2 = "karma", return 3.

我的代码

class Solution:
    def minDistance( self,word1: 'str', word2: 'str') -> 'int':
        if len(word1)==0:
            return len(word2)
        if len(word2)==0:
            return len(word1)
        l1 = len(word1)
        l2 = len(word2)
        dp = [[0 for i in range(l1+1)] for j in range(l2+1)]
        for i in range(l1+1):
            dp[0][i] = i
        for i in range(l2+1):
            dp[i][0] = i
        for i in range(1, l2+1):
            for j in range(1, l1+1):
                if word1[j-1] == word2[i-1]:
                    dp[i][j] = min(1+min(dp[i-1][j],dp[i][j-1]),dp[i - 1][j - 1])
                else:
                    dp[i][j] = 1 + min(dp[i - 1][j - 1], dp[i][j - 1], dp[i - 1][j])
        return dp[-1][-1]

思路
mart
karma
动态规划,dp[i1][i2]二位数组表示从第一个单词的i1到第二个单词i2的编辑距离是多少
删除,增加,替换三种情况
如果word[i1] == word[i2]那么dp[i1][i2]==min(dp[i1-1][i2-1],dp[i1-1][i2]+1, dp[i1][i2-1]+1)
如果不等于,是min(dp[i1-1][i2]+1, dp[i1][i2-1]+1,dp[i1-1][i2-1]+1)
dp[i1-1][i2]+1 :删掉word第i1的字符
dp[i1][i2-1]+1:增加一个字符
dp[i1-1][i2-1]+1:替换一个字符

  • 时间复杂度 O(len(word1)*len(word2))
  • 出错
  1. 初始化注意: dp的大小应该是(len(word1)+1)* (len(word2)+1),存在和空字符对比这一初始条件
  2. word[i1] 是否等于 word[i2]只改变了替换的结果,但最终结果还是要和增减字符进行比较

猜你喜欢

转载自www.cnblogs.com/siriusli/p/10390003.html