题解 | #编辑距离(二)#

编辑距离(二)

http://www.nowcoder.com/practice/05fed41805ae4394ab6607d0d745c8e4

写个 二维数组方式实现的编辑距离。 对于一维数组的改进方式 来简化空间复杂度, 我不是很能理解。 所以我对这道题目的把握更多是理解掌握二维数组的动态规划过程。 需要的话 会回来更新 对一维数组的使用

class Solution:
    def minEditCost(self , str1: str, str2: str, ic: int, dc: int, rc: int) -> int:
        # write code here
        # minimum cost 
        n= len(str1)
        m=len(str2)
        
        #consider null case
        if n==0 and m!=0:
            # insert in str1 to be str2
            return m*ic 
        if m==0 and n!=0:
            #delete from str1 to be null
            return dc*n
        # initialize two dimensional array
        DP= [[0]*(m+1) for _ in range(n+1)]
        print('dp1',DP)
        #fill in edge case 
        for i in range(n+1):
            DP[i][0]=i*dc # str2 is null, then we ned delete from str1 with i times insertion, couning as dc
        for j in range(m+1):
            DP[0][j]=j*ic # str1 is null then make it to be as str2[:j] then insert 
        print('dp2',DP)
        
        # calculate DP[i][j] based on dynamic equation
        #DP[i][j] = min(DP[i-1][j]+1, DP[i][j-1]+1, DP[i-1][j-1]+ int(str1[i]!=str2[j]))
        for i in range(1,n+1):
            for j in range(1,m+1):
                left=DP[i-1][j]+1*dc # delete from str1, 1 means one operation
                down=DP[i][j-1]+1*ic # insert into str1 1 means one operation like insert/delete once
                left_down=DP[i-1][j-1] # 
                if str1[i-1] != str2[j-1]:
                    # 这里 条件 index 是 i-1, j-1 是因为DP 比实际字串多一行和一列。 理解时候理解为对角上的变换
                    # 比如 你已经 填了 所有边界条件,并且 推出 DP[1][1] 代价为 X, 你想知道 DP[2][2] 代表的代价
                    #值是多少  字符串1 是HOR, 字符串2 是RO。 所以 DP[1][1] 代表从字符串1 的前1个字符就是H 
                    #编辑到字符串2 的前1 个字符就是 R 的代价是X, 问的是从字符串的前2个字符 HO 编辑到 字符串的前
                    # 2 个字符 RO 的代价是多少。我们可以列一个 二维的 DP 列表 考虑空字符情况和 各有1个字符等等 
                    #所有可能长度的组合是一个二维的数组列表。 DP[2][2] 可以由 DP[2][1] 加操作得到 就是 HO 先编辑成
                    # R 然后 只要插入O 就是 RO 所以代价是 DP[2][1]+1, 或者 从 DP[1][2] 就是H 先变成 RO 再 因为 
                    #两个字符串的第二个字符相等 所以DP[2][2]不用再编辑这样就是 代价值DP[1][1]==DP[2][2]. 
                    # 这里条件判断时候。I,J 是2 但是字符是从INDEX 0 开始count。所以条件是str1[i-1] != str2[j-1]:?  
                    # 如果 两个字符的第二个字符不相等 那么我们需要进行替换的操作比如 字符串前两个字符不是HO 而是 HY
                    # 这样编辑成 RO 时候 我们已经知道H 到R 的代价 那么需要变成RO 就是 替换 Y 变成O 
                    # 这样我们就需要 在DP[1][1] 上加上 替换的代价值就是 我们下面做的 
                    left_down+=1*rc # if the letter is not the same then we need to replace 
                DP[i][j]= min(left,down,left_down)
        return DP[n][m]
        
                    
        
全部评论

相关推荐

头像
11-06 10:58
已编辑
门头沟学院 嵌入式工程师
双非25想找富婆不想打工:哦,这该死的伦敦腔,我敢打赌,你简直是个天才,如果我有offer的话,我一定用offer狠狠的打在你的脸上
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务