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

编辑距离(二)

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]
        
                    
        
全部评论

相关推荐

天天困啊:个人建议第一点就是熟悉Redis这里不要这么写,写上Redis比较核心的技术,什么缓存一致性,雪崩穿透击穿那些,掌握cos其实不用写在专业技能里这个你做了鱼皮的这个项目面试官默认应该认为你应该懂了,鱼皮这个项目核心挺多建议多啃啃,在做一个鱼皮的微服务项目俩项目在一起比较好哦
你的简历改到第几版了
点赞 评论 收藏
分享
08-12 09:16
Java
牛客38753147...:后端的竞争者一届比一届卷,前两年非985还很多,一段大厂实习就已经非常优秀了。 现在985硕多如狗,人手一段大厂实习,而且腾讯和百度今年都宣布实习扩招了一倍不止,越来越多的人从本一研一就开始刷实习,信息差也基本没有了。可以预见的,以后只会越来越卷。
投递快手等公司10个岗位
点赞 评论 收藏
分享
脑子烧了,这是什么规律啊。1,10,19,37,64,( )
hl7:0*9+1 1*9+1 2*9+1 4*9+1 7*9+1,9的系数是前两个系数相加再加1?
投递美团等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务