题解 | #最小编辑代价#

最小编辑代价

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

动态规划做法

之前做过类似的题目,那个题目中插入、删除、替换的代价都是相同的,都是1,在这个题目里面是不同的。

理解的时候需要注意,是要由str1变成str2。变化情况分三种,对str1进行插入,对str1进行删除,对str1进行替换。
dp数组的i行j列代表str1的前i个字符编辑成str2的前j个字符的最小代价。
假设str1的第i个字符和str2的第j个字符匹配,dp[i][j]=dp[i-1][j-1],因为str1的前i-1个字符已经和str2的前j-1个字符相同了。
当str1的第i个字符和str2的第j个字符不匹配时,三种选择,对str1的字符进行1)删除、2)插入、与3)替换,这些操作都是发生在str1上。
1)删除。将str1的第i个字符删除,删除这一个字符,那怎么让str1变成str2啊?这时我们就寄希望于str1的前i-1个字符和str2的前j个字符相同了,将str1的前i-1个字符变成str2的前j个字符的代价已经求出了,就是dp[i-1][j],所以删除str1的第i个字符,str1的前i个字符还能和str2的前j个字符相同的代价就是dp[i-1][j]+dc。
2)插入。在str1的第i个位置后进行插入,使得str1的前i个字符和str2的前j个字符相同,那得要求str1的前i个字符和str2的前j-1个字符相同啊,这时候再进行插入,也就是将str2的第j个字符插入到str1的第i个字符之后。此时编辑代价为dp[i][j-1]+ic。
3)替换。替换好解释,就是str1的前i-1个字符变成str2的前j个字符的代价,加上将str1的第i个字符替换为str2的第j个字符的代价。dp[i-1][j-1]+rc。

class Solution:
    def minEditCost(self , str1 , str2 , ic , dc , rc ):
        m,n=len(str1),len(str2)
        dp=[[0]*(n+1) for _ in range(m+1)]
        for i in range(m+1):
            dp[i][0]=i*dc
        for j in range(n+1):
            dp[0][j]=j*ic
        for i in range(1,m+1):
            for j in range(1,n+1):
                cost = 0 if str1[i-1]==str2[j-1] else rc
                dp[i][j]=min(dp[i-1][j]+dc,dp[i][j-1]+ic,dp[i-1][j-1]+cost)
        return dp[m][n]
全部评论

相关推荐

bg双非本科,方向是嵌入式。这次秋招一共拿到了 8 个 offer,最高年包 40w,中间也有一段在海康的实习经历,还有几次国家级竞赛。写这篇不是想证明什么,只是想把自己走过的这条路,尽量讲清楚一点,给同样背景的人一个参考。一、我一开始也很迷茫刚决定走嵌入式的时候,其实并没有一个特别清晰的规划。网上的信息很零散,有人说一定要懂底层,有人说项目更重要,也有人建议直接转方向。很多时候都是在怀疑:1.自己这种背景到底有没有机会2.现在学的东西到底有没有用3.是不是已经开始晚了这些问题,我当时一个都没答案。二、现在回头看,我主要做对了这几件事第一,方向尽早确定,但不把自己锁死。我比较早就确定了嵌入式这个大方向,但具体做哪一块,是在项目、竞赛和实习中慢慢调整的,而不是一开始就给自己下结论。第二,用项目和竞赛去“证明能力”,而不是堆技术名词。我不会刻意追求学得多全面,而是确保自己参与的每个项目,都能讲清楚:我负责了什么、遇到了什么问题、最后是怎么解决的。第三,尽早接触真实的工程环境。在海康实习的那段时间,对我触动挺大的。我开始意识到,企业更看重的是代码结构、逻辑清晰度,以及你能不能把事情说清楚,而不只是会不会某个知识点。第四,把秋招当成一个需要长期迭代的过程。简历不是一次写完的,面试表现也不是一次就到位的。我会在每次面试后复盘哪些问题没答好,再针对性补。三、我踩过的一些坑现在看也挺典型的:1.一开始在底层细节上纠结太久,投入产出比不高2.做过项目,但前期不会总结,导致面试表达吃亏3.早期有点害怕面试,准备不充分就去投这些弯路走过之后,才慢慢找到节奏。四、给和我背景相似的人一点建议如果你也是双非,准备走嵌入式,我觉得有几件事挺重要的:1.不用等“准备得差不多了”再投2.项目一定要能讲清楚,而不是做完就算3.不要只盯着技术,多关注表达和逻辑很多时候,差的不是能力,而是呈现方式。五、写在最后这篇总结不是标准答案,只是我个人的一次复盘。后面我会陆续把自己在嵌入式学习、竞赛、实习和秋招中的一些真实经验拆开来讲,希望能对后来的人有点帮助。如果你正好也在这条路上,希望你能少走一点弯路。
x_y_z1:蹲个后续
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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