【来不及刷题之】32、编辑距离(动态规划)

news2024/11/23 14:53:33

在这里插入图片描述

  • 明确dp函数的🍓💗👉定义dp(s1,s2,i,j ):s1[0…i]变成s2[0…j]的最小编辑距离
  • 选择:对于每一个位置,s1可以:不做任何操作(在相等时),删除,在后一个位置插入,替换 一共有四种操作
  • base case:当某一个字符串遍历结束时,可以选择将s1前面全部执行插入操作,或者全部执行删除操作
class Solution {
    public int minDistance(String word1, String word2) {
        int n1=word1.length();
        int n2=word2.length();
        return dp(word1,word2,n1-1,n2-1);
    }

    int dp(String s1, String s2,int i, int j){
        if(i<0)
            return j+1;//j是下标,s1遍历结束之后,将s2剩下的元素逐个插入到s1前面
        if(j<0)
            return i+1;//s2遍历结束之后,将s1前面的元素逐个删除
        if(s1.charAt(i)==s2.charAt(j))
            return dp(s1,s2,i-1,j-1);//相等时不做任何操作
        int op1=dp(s1,s2,i-1,j)+1;//删除s1[i],可以理解为跳过s1[i],所以下标要-1
        int op2=dp(s1,s2,i,j-1)+1;//在s1[i+1]位置插入s2[j], s2[j]完成匹配
        int op3=dp(s1,s2,i-1,j-1)+1;//把s1[i]替换成s2[j],两个人都完成了匹配,都向前移动一步
        return Math.min(Math.min(op1,op2),op3);
    }
}
  • 上面的方法好理解,但是会超时,因此需要使用备忘录对这个动态规划算法记性改进
  • 需要注意二维数组初始化时用到了函数 Arrays.fill(line,-1)
  • 另外, if(memo[i][j]!=-1) 的判断要在 if(i<0) 之后,不然会有-1越界的问题
class Solution {
    int[][] memo;
    public int minDistance(String word1, String word2) {
        int n1=word1.length();
        int n2=word2.length();
        memo=new int[n1][n2];
        for(int[] line : memo){
            Arrays.fill(line,-1);
        }
        return dp(word1,word2,n1-1,n2-1);
    }

    int dp(String s1, String s2,int i, int j){
       
        if(i<0)
            return j+1;//j是下标,s1遍历结束之后,将s2剩下的元素逐个插入到s1前面
        if(j<0)
            return i+1;//s2遍历结束之后,将s1前面的元素逐个删除
        
        if(memo[i][j]!=-1)
            return memo[i][j];

        if(s1.charAt(i)==s2.charAt(j))
            memo[i][j]=dp(s1,s2,i-1,j-1);//相等时不做任何操作
        else{
            int op1=dp(s1,s2,i-1,j)+1;//删除s1[i],可以理解为跳过s1[i],所以下标要-1
            int op2=dp(s1,s2,i,j-1)+1;//在s1[i+1]位置插入s2[j], s2[j]完成匹配
            int op3=dp(s1,s2,i-1,j-1)+1;//把s1[i]替换成s2[j],两个人都完成了匹配,都向前移动一步
            memo[i][j]=Math.min(Math.min(op1,op2),op3);
        }
        return memo[i][j];
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/588650.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PMP适合哪些人去考?

从技术向管理转型的工程技术人员&#xff1a;对于那些在职业生涯中转向项目管理的技术人员&#xff0c;PMP证书提供了必要的桥梁&#xff0c;使他们能够掌握项目管理的基本原理和最佳实践。 缺乏系统项目管理理论知识的项目经理&#xff1a;大部分项目经理都是技术出身&#x…

【OneNet】| stm32+esp8266-01s—— OneNet初体验 | 平台注册及设备创建 | demo使用

系列文章目录 失败了也挺可爱&#xff0c;成功了就超帅。 文章目录 前言1. OneNet平台注册2. 创建多协议接入设备3. 硬件连接4. 下载并运行Demo4.1 Demo下载4.2 运行Demo本小节结束 前言 最近准备耍下 Onenet平台 。下载了官方demo 遇到几个问题 1、创建接入设备 因为平台网页…

【LeetCode】5,最长回文子串。 难度等级:中等。解法很多,值得推敲。

文章目录 一、题目二、我的解答&#xff1a;双指针从头开始遍历2.1 暴力循环&#xff1a;超出时间限制2.2 优化后的暴力循环&#xff1a;虽然没有超时&#xff0c;但效率很低 三、双指针中心扩散法&#xff08;从字符串中心开始遍历&#xff09;四、动态规划法4.1 我的错误解答…

HTML+CSS实训——Day06——发现页的用JavaScript修改

仓库链接:https://github.com/MengFanjun020906/HTML_SX 前言 昨天学习了javascript的一些知识点&#xff0c;今天要学习dom的操作了&#xff0c;也就是文档对象模型的操作。 dom操作 <body><div id"i1">这是一个div</div><script>// dom…

一次redis主从切换导致的数据丢失与陷入只读状态故障

背景 最近一组业务redis数据不断增长需要扩容内存&#xff0c;而扩容内存则需要重启云主机&#xff0c;在按计划扩容升级执行主从切换时意外发生了数据丢失与master进入只读状态的故障&#xff0c;这里记录分享一下。 业务redis高可用架构 该组业务redis使用的是一主一从&am…

Spring Boot 如何实现邮件发送

Spring Boot邮件发送 在现代的Web应用程序中&#xff0c;邮件通知已经成为了一项非常重要的功能。例如&#xff0c;在用户注册、密码重置、订单确认等方面&#xff0c;我们通常都会使用邮件来通知用户。在Spring Boot应用程序中&#xff0c;我们可以使用JavaMailSender来实现邮…

2022年长三角高校数学建模竞赛A题学在长三角解题全过程文档及程序

2022年长三角高校数学建模竞赛 A题 学在长三角 原题再现&#xff1a; 长三角高等教育规模和优质高等教育资源数量处于全国领先水平。从 2019年和 2013-2019 年的平均值来看&#xff0c;长三角地区人口数量在全国占比分别是 16.22&#xff05;和 16.10&#xff05;&#xff0c…

在Css上吃过的亏

一、前言 最近参加了公司的一个小程序的开发项目&#xff0c;虽然很简单&#xff0c;但是非常急三天就要交。本来就是实习生加上前端不熟练的我&#xff0c;最终在Css定位上吃了很大的亏。今天就来了解一下Css中的几个定位。 二、什么是定位 在Css中有一个position属性&…

技术干货 | ​Navicat 面向 PostgreSQL 查询超时的工具解决方案

早前&#xff0c;我们发表过一篇《PostgreSQL 与 Navicat &#xff1a;数据库的中坚力量》 &#xff0c;从产品的发展介绍了两者的渊源与共性&#xff0c;获得了许多童鞋的认可。而随着PostgreSQL 在国内热度愈发高涨&#xff0c;应用也愈发广泛。近期&#xff0c;我们收到许多…

Chirpstack服务器简介和搭建教程

LoRaWAN网络主要优势体现在低成本、广域连接和低功耗&#xff0c;同时具有较多的开源平台可供使用。使用Chirpstack服务器可以快速搭建本地LoRaWAN网络。本文重点介绍一下Chirpstack服务器是做什么的和Chirpstack服务器的安装教程&#xff1a; Chirpstack是一款多组件的、部署…

vue中 antdesginVue <a-image/>图片标签去掉蒙层(鼠标滑过)里面的“预览”二字 或者使用deep自定义样式不生效问题。

vue中 antdesginVue 图片标签去掉蒙层&#xff08;鼠标滑过&#xff09;里面的“预览”二字 或者使用deep自定义样式不生效问题。 看似去掉这两个字很简单&#xff0c; 其实搞了我一上午&#xff0c;是真的不好去掉呀&#xff0c;这里得吐槽下ant官方 。。。。什么deep呀都是不…

是面试官放水,还是公司实在是太缺人?这都没挂,字节跳动原来这么容易进...

字节是大企业&#xff0c;是不是很难进去啊&#xff1f;” “在字节跳动做软件测试&#xff0c;能得到很好的发展吗&#xff1f; 一进去就有12K&#xff0c;其实也没有想的那么难” 直到现在&#xff0c;心情都还是无比激动&#xff01; 本人211非科班&#xff0c;之前在华为和…

PostgreSQL 16 beta 重磅发布,OpenPie 再次引领中国贡献关键力量

PostgreSQL 一直被誉为全球最先进的开源关系数据库之一&#xff0c;在 DB-engines 排行榜上长期稳居前五。5 月 25 日&#xff0c;PostgreSQL 全球开发团队官方宣布&#xff0c;PostgreSQL 16 Beta 1 版本正式发布。 本次 PostgreSQL 新版本功能亮点众多&#xff0c;涉及多个模…

Docker环境java程序的时间设置

先上解决方案 java程序生成的时间、日志时间不对的解决方案&#xff1a; #在Dockerfile文件中加入以下两行代码&#xff0c;用于指定bild的镜像为东八区 ENV TZAsia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneDoc…

生产检验配置和操作

1、概念 在SAP系统的生产过程中运行中间产品或成品的质量流程&#xff0c;例如每个班次的检查等&#xff0c;在生产订单发布时生成检验批&#xff0c;在系统中进行检验的检验类型为03&#xff0c;当有生产订单发布时&#xff0c;将在系统中自动创建检验批。 2、前台和后台配置…

【操作系统】03.内存管理

存储器的层级结构 程序的运行 现代操作系统使用的连接方式&#xff1a;运行时动态链接 对某些模块的链接推迟到程序执行时才进行 现代操作系统使用的装入方式&#xff1a;动态重定位 程序装入内存后&#xff0c;逻辑地址不会立即转换成物理地址&#xff0c;而是推迟到指令执行…

Energy-Based Learning for Scene Graph Generation

[2103.02221] Energy-Based Learning for Scene Graph Generation (arxiv.org) 目录 Abstarct 1 Introduction 2 Approach 2.1 Scene Graph Generation 2.2 Energy Based Modeling 2.3 Energy Models for Scene Graphs Generation 2.4 Energy Model Architectue 2.4.1…

PCB多层板为什么都是偶数层?奇数层不行吗?

PCB板有单面、双面和多层的&#xff0c;其中多层板的层数不限&#xff0c;目前已经有超过100层的PCB&#xff0c;而常见的多层PCB是四层和六层板。那为何大家会有“PCB多层板为什么都是偶数层&#xff1f;”这种疑问呢&#xff1f;相对来说&#xff0c;偶数层的PCB确实要多于奇…

朋友面试字节要求月薪25K,明显感觉他背了很多面试题...

最近有朋友去字节面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&#…

Unity WebGL打包配置本地服务器

第一步打包 1&#xff09;、先对Player Setting进行设置 2&#xff09;、设置打包的窗口大小 3&#xff09;、遇到异常以及压缩格式 第一个启用异常&#xff0c;指用户指定在运行时意外的代码行为&#xff08;通常被认为错误&#xff09;如何被处理&#xff0c;有三个选项…