蠡口72. Edit Distance

做这道题之前建议先做one edit distance,那道题我本能地使用DP结果超时。这道题里用DP正好。思路是这样:

1、建立2维数组dp,dp[i][j]表示word1[0:i]与word2[0:j]的edit distance(最短编辑距离),注意这里dp矩阵的大小是(len1+1)*(len2+1),
因为word1与word2有可能是空字符串; 

2、确定边界条件:空字符串与其他任意字符串的最短编辑距离为该字符串的长度(只能一直往空字符串里添加字符才能与该字符串相等),于是:
dp[0][j]=j;dp[i][0]=i;

3、建立递推关系:
当我们考虑给dp[i][j]赋值时,我们其实是在比较以下两个字符串: 

word1: .........(i-2)(i-1)
word2: ..........(j-2)(j-1)

此时word1[i-1]与word2[j-1]可以相等和不等两种情况:

3.1) word1[i]==word2[j]时,
那么dp[i][j]有可能为以下3个值中的一个:
3.1.1) word1 在i-1处不采取任何措施 => dp[i][j]=dp[i-1][j-1];
3.1.2) word1 删除i-1处的字符 => dp[i][j]=dp[i-1][j]+1;
3.1.3) word1 在i-1后插入word2[j-1] => dp[i][j]=dp[i][j-1]+1;
由于我们试求最小距离,所以dp[i][j]应该是这三个数的最小值

3.2) word1[i]==word2[j]时,
那么dp[i][j]有可能为以下3个值中的一个:
3.1.1) word1 在i-1处替换word1[i]为word2[j] => dp[i][j]=dp[i-1][j-1]+1;
其他2个操作与3.1)相同,同理由于我们试求最小距离,所以dp[i][j]应该是这三个数的最小值

class Solution(object):
    def minDistance(self, word1, word2):
        """
        :type word1: str
        :type word2: str
        :rtype: int
        """
        len1,len2=len(word1),len(word2)
        #if min(len1,len2)==0: return(max(len1,len2))
        dp=[[0 for j in range(len2+1)] for i in range(len1+1)]
        for i in range(len1+1): dp[i][0]=i
        for j in range(len2+1): dp[0][j]=j
        for i in range(1,len1+1):
            for j in range(1,len2+1):
                if word1[i-1]==word2[j-1]: dp[i][j]=min(dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1])
                else: dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1
        return(dp[len1][len2])
    

猜你喜欢

转载自www.cnblogs.com/Leisgo/p/11696182.html