首页 > 其他分享 >72. 编辑距离

72. 编辑距离

时间:2022-11-20 10:12:44浏览次数:35  
标签:return helper 距离 编辑 range word1 72 word2 dp

题目描述

给了两个单词word1和word2,问如果将word1转化为word2需要最少操作数?
可以怎么操作?插入字符,删除字符,替换字符

f1-动态规划-自底向上

基本分析

  1. 先明确可能的操作有几种?6种
  2. 以上6种有没有等价的,可以减少思考维度?有等价的,最后剩3种,word1增加,word1删除,word1修改
  3. 怎么定义状态?比较常见,定义为f[i][j]表示word1的前i个字符修改为word2的前j个字符的最少,因为考虑有0,0的情况,比字符长度多定义一位
  4. 考虑怎么转移?(1)分析第i位个第j位的关系,相同则可用f[i-1][j-1]转移;(2)不相同则在3个操作(删、增加、改)中取最小
  5. 对某个词是0的情况怎么进行边界处理?区分word1和word2是0的情况。(1)word1是0,锁定f[i]是0, 需要在列的维度上逐个字符去加;(2)word2是0,锁定f[j]是0,需要在行的维度上逐个去加

代码

class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        m, n = len(word1), len(word2)
        f = [[0]*(n+1) for _ in range(m+1)]

        # 预处理都是0的情况
        f[0][0] = 0
        # word2是0的情况,对应word1删除
        for i in range(1, m+1):
            f[i][0] = f[i-1][0] + 1
        # word1是0的情况,对应word1增加
        for j in range(1, n+1):
            f[0][j] = f[0][j-1] + 1
        
        # 其他情况,取3种可能最小
        for i in range(1, m+1):
            for j in range(1, n+1):
                if word1[i-1] == word2[j-1]:
                    f[i][j] = f[i-1][j-1]
                else:
                    f[i][j] = min(f[i-1][j-1], f[i][j-1], f[i-1][j]) + 1
        return f[-1][-1]

复杂度

时间:\(O(m \cdot n)\)
空间:\(O(m \cdot n\)

总结

涉及这种2个字符串匹配的,考虑最少是两个维度,看有没有可能前i去满足前j
这里操作比较多,需要考虑有没有可能等价,这里把6转化成了3
这里的操作针对的是前i个前j,删除、增加、修改并没有限定位置
在转移的时候,根据末尾做了分类,相同简单,不同是3个的最小+1
定义状态的时候考虑要不要多定义一位?前0位在dp里面是有意义的,所以多定义了一位,在写末尾判断的时候,需要注意索引是第几位-1
对首行和首列的边界条件,可以先预处理了,这样一般情况的dp转移不用考虑太多边界



f2-状态压缩+自顶向下

基本分析

其他同上,这里考虑怎么用记忆化搜索实现

  1. 和dp的区别?(1)两个的方向不一样,dp是00时候知道结果,搜索是终点知道结果(某一个达到长度);(2)传递时候已知的方向不一样,一个前一个后
  2. 怎么写搜索?(1)参数:处理到的索引,从0开始;(2)结束情况:某一个单词达到了长度,剩余就能口算了,特别的,这里可以考虑边界上的情况;(2)转移:某位等和不等两种情况;(3)返回:最少次数

代码

class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        m, n = len(word1), len(word2)

        @cache
        def helper(i, j):
            # 达到了word1的长度:
            if i == m:
                return n-j
            # 达到了word2的长度
            if j == n:
                return m-i
            if word1[i] == word2[j]:
                return helper(i+1, j+1)
            else:
                ins = helper(i+1, j) + 1
                dele = helper(i, j+1) + 1
                rep = helper(i+1, j+1) + 1
                return min(ins, dele, rep)
        
        return helper(0, 0)

复杂度

时间:\(O(m \cdot n)\)
空间:\(O(m \cdot n)\)

总结

需要注意两者方向上的差别,导致在已知状态+递归方向上的区别
另外判定索引和单词长度的写法,避免了额外边界的讨论

标签:return,helper,距离,编辑,range,word1,72,word2,dp
From: https://www.cnblogs.com/zk-icewall/p/16907932.html

相关文章

  • Linux大神必备-文本编辑器
    我们在 Linux 上不缺乏非常现代化的编辑软件,但是它们都是基于GUI(图形界面)的编辑软件。正如你所了解的:Linux真正的魅力在于命令行,当你正在用命令行工作时,你就需要一......
  • UE编辑器扩展
    EditorPlugin新建plugin包含多个modules默认包含Type为Runtime和Editormodule模块定义文件定义了依赖的模块WidgetReflector显示Slate的构造 自定义属性注册......
  • 篇(14)-Asp.Net Core入门实战-权限管理之角色编辑和赋权(ViewModel-DTO初探)
    入门实战-权限管理之角色编辑和赋权(ViewModel-DTO初探)前面几章讲了菜单功能的管理之后,我们再创建一个角色管理的功能,创建过程不再详细介绍,只要按照菜单管理功能的步骤进......
  • Docker Host '172.17.0.1' is blocked because of many connection errors; unblock w
    产生的原因是:同一个ip在短时间内产生太多(超过mysql数据库max_connect_errors的最大值)中断的数据库连接而导致的阻塞   解决方法:使用mysqladminflush-hosts命令清......
  • 72:局部变量和全局变量_效率测试
    ###局部变量和全局变量效率测试局部变量的查询和访问速度比全局变量快,优先考虑使用,尤其是在循环的时候。在特别强调效率的地方或者循环次数较多的地方,可以通过将全局变量......
  • 带参数的ASP.NET MVC编辑器模板/ UIHint
    ASP.NETMVCEditor-Templates/UIHintwithparameters过去,我通过应用以下数据注释来像这样一直使用Editor-Templates:1[UIHint("SomeTemplate")]ViewMode......
  • 编辑器二次开发
    快速添加盒型碰撞器批量设置字体查询信息记录历史记录,清除记录usingSystem.Collections.Generic;usingUnityEngine;usingUnityEditor;usingSystem;usingUnity......
  • UE4 UE5 Unreal Engine 编辑器开发 批量给模型添加材质
    这部分主要使用的是蓝图的编辑器开发。具体的蓝图代码如下图所示:   ......
  • vue后台管理系统"编辑按钮"书写逻辑
    不废话上思路外部el-table-column是基础table模板,里面templateslot-scope的主要作用就是获取table一行的数据信息;其次要加一个对话框,在对话框里输入数值然后提交就可......
  • P1972 [SDOI2009] HH的项链
    P1972 [SDOI2009]HH的项链将全部输入排序,进行离散化#include<bits/stdc++.h>usingnamespacestd;#definerintregisterintconstintN=1e6+7;inta[N],tr......