leetcode583. 两个字符串的删除操作(java-动态规划)

news2024/11/17 7:57:07

两个字符串的删除操作

  • leetcode583. 两个字符串的删除操作
    • 题目描述
    • 解题思路
    • 解法一 递归加缓存
    • 动态规划
      • 代码演示
  • 动态规划专题

leetcode583. 两个字符串的删除操作

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/delete-operation-for-two-strings

题目描述

给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。
每步 可以删除任意一个字符串中的一个字符。

示例 1:
输入: word1 = “sea”, word2 = “eat”
输出: 2
解释: 第一步将 “sea” 变为 “ea” ,第二步将 "eat "变为 “ea”

示例 2:
输入:word1 = “leetcode”, word2 = “etco”
输出:4

提示:
1 <= word1.length, word2.length <= 500
word1 和 word2 只包含小写英文字母

解题思路

这题最直观的思考还是暴力递归,用两个指针,卡住两个单词的起始位置,如果相同,同时跳到下一个位置,如果不同,就有两种情况了,是单词1删除还是单词2删除,因为要求出最小步数,所以,我们要两种情况都去考虑,要最小值.

解法一 递归加缓存

  /**
     * 最小步数
     * @param word1
     * @param word2
     * @return
     */
    public int minDistance(String word1, String word2) {
        int n = word1.length();
        int m = word2.length();
        int[][] dp = new int[n + 1][m + 1];
        return process(word1.toCharArray(),n - 1,word2.toCharArray(),m - 1,dp);
    }

    /**
     * 暴力递归加缓存 
     * @param word1
     * @param i 
     * @param word2
     * @param j
     * @param dp
     * @return
     */
    public int process(char[] word1,int i,char[] word2,int j,int[][]dp){
        if (i == -1 && j == -1){
            return 0;
        }
        if (i == -1){
            return j + 1;
        }
        if (j == -1){
            return i + 1;
        }
        if (dp[i][j] != 0){
            return dp[i][j];
        }
        int res = 0;
        //相等时,当前不做操作,等于下一个位置,
        if(word1[i] == word2[j]){
            res = process(word1,i - 1,word2, j - 1,dp);
        }else{
            //word1 删除
            int p1 = process(word1,i -  1,word2,j ,dp);
            //word2 删除
            int p2 = process(word1,i ,word2,j - 1,dp);
            //取两种情况最小步数,加上当前字符本身操作,
            res = Math.min(p1,p2) + 1;
        }
        dp[i][j] = res;
        return res;
    }

动态规划

暴力递归改动态规划,分为三个步骤,
1.初始化dp表
2.把递归过程改成从表中拿值的过程
3.返回dp表数据

先看下如何初始化,如果word1 长度为0 时,那么操作的次数就是把word2 全部删除,就是word2 的长度,反之,word2 长度是0 的时候,需要操作的步数就是word1 的长度,由此我们可以初始化出表中的数据,
如图演示:
在这里插入图片描述
第一行和第一列就可以初始出来了,
操作时,从1开始,比较时别忘记减1.

代码演示

  /**
     * 动态规划
     * @param word1
     * @param word2
     * @return
     */
    public int minDistance(String word1, String word2){
        int n = word1.length();
        int m = word2.length();
        int[][] dp = new int[n + 1][m + 1];
        //第一行
        for (int i = 1;i <= m;i++){
            dp[0][i] = i;
        }
        //第一列
        for (int j = 1; j <= n;j++){
            dp[j][0] = j;
        }
        for (int i = 1; i <= n;i++){
            for (int j = 1; j <= m;j++){
                //比较时,要减1,下标从0开始的
                if (word1.charAt(i - 1) == word2.charAt(j - 1)){
                    dp[i][j] = dp[i - 1][j - 1];
                }else{
                    int p1 = dp[i - 1][j];
                    int p2 = dp[i][j - 1];
                    dp[i][j] = Math.min(p1,p2) + 1;
                }
            }
        }
        return dp[n][m];
    }

动态规划专题

leetcode514. 自由之路

leetcode887. 鸡蛋掉落

leetcode1884. 鸡蛋掉落-两枚鸡蛋

leetcode312. 戳气球

leetcode787. K 站中转内最便宜的航班

leetcode62. 不同路径

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

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

相关文章

算法基础修炼

算法基础 数据结构与算法 字符串匹配 KMP算法&#xff1a; 字符串算法之KMP&#xff08;字符串匹配&#xff09;kmp字符串匹配算法青萍之末的博客-CSDN博客 各大排序算法&#xff1a; 冒泡排序&#xff1a; 选择排序&#xff1a; 类似于冒泡算法&#xff0c;不断找到乱…

Android 编译Android7.0版本源码

编译Android7.0版本源码 前言正文一、前置条件二、编译准备三、下载编译源码1. 下载Repo2. 初始化仓库3. 同步远程代码4. 编译源码5. 启动模拟器 四、编译中的问题① Jack-Server② 本地化设置③ Communication error with Jack server (35), try jack-diagnose or see Jack se…

Pycharm中运行Allure报错不是内部或外部命令的解决方案

问题现象&#xff1a; Allure已安装并配置好系统环境变量&#xff1a; 1、Allure的下载地址&#xff1a;https://github.com/allure-framework/allure2/releases 2、下载后解压&#xff0c;将解压后的bin路径配置到环境变量中&#xff1a; allure-pytest插件也已安装好&#x…

Thinkphp5分页后携带参数进行跳转传递

问题&#xff1a; 我在tp框架中写了一个图书详情分页的&#xff0c;代码如下&#xff1a; public function verify_details(){$sell_order_numinput(sell_order_num);$resDB::table(verif)->where(["sell_order_num">$sell_order_num])->paginate(10);// 模…

Linux上安装matlab

首先需要下载文件&#xff0c;微人大正版软件下载里有 然后直接点击&#xff0c;就可以就可以安装&#xff0c;不需要使用挂载命令&#xff0c;然后使用 ./install就可以进行安装了&#xff0c;这里记住是得登录自己的人大邮箱&#xff0c;否则无法激活&#xff0c;然后修改安…

LINUX7下安装kaldi实战

LINUX7下安装kaldi实战&#xff0c;需要升级gcc版本。还需要将kaldi相关的github.com替换为kgithub.com。 1 升级安装gcc过程 我是在LINUX7.5下安装部署得kaldi。自带的gcc版本为4.8.5&#xff0c;所以需要安装升级gcc. 1.1 安装说明 gcc库包含3个依赖库&#xff1a;gmp、m…

【各种乐器波形图】笛子、二胡、钢琴、号角等乐器波形图研究

标题&#xff1a;不同乐器波形图 笛子的频率取决于其音高&#xff0c;不同音高的笛子频率也不同。以C调笛子为例&#xff0c;其最基本的频率为261.63 Hz&#xff08;即中央C的频率&#xff09;。而其他调号的笛子的基本频率则会有所不同。 笛子的波形图&#xff1a; import n…

有奖问卷 | 2023 中国软件研发效能调查问卷即将截止

中国信通院将根据问卷征集和企业调研结果&#xff0c;与业内专家共同撰写**《2023 中国软件研发效能调查报告》**&#xff0c;研判发展趋势&#xff0c;提供研发效能体系建设建议&#xff0c;并于 2023 年 7 月 7 日正式发布调查报告解读。 随着云计算应用的不断深入&#xff0…

微信小程序中使用echart、动态加载几条折线

一、示例 echart小程序示例 gitub地址&#xff1a;GitHub - ecomfe/echarts-for-weixin: Apache ECharts 的微信小程序版本 在小程序中放入 效果 二、 小程序代码 json 组件的位置取决于一示例中的的echart的位置 { "navigationStyle":"custom","…

STM32速成笔记—EEPROM(AT24C02)

文章目录 一、AT24C02简介二、AT24C02引脚三、AT24C02寻址四、AT24C02读/写操作4.1 AT24C02写操作4.2 AT24C02读操作 五、AT24C02程序六、应用实例七、拓展应用 一、AT24C02简介 AT24C01/02/04/08/16…是一个1K/2K/4K/8K/16K位电可擦除PROM&#xff0c;内部含有128/256/512/10…

数据中心供配电系统负荷的计算方法(三)

数据中心供配电系统是为机房内所有需要动力电源的设备提供稳定、可靠的动力电源支持的系统&#xff1b;是数据中心日常运维的重大支出之一&#xff0c;在数据中心&#xff0c;供配电系统相当于一个人的“心脏和血管”&#xff0c;负责把能量输送到系统的每一台设备。一旦供配电…

伦敦金价格实时查询

伦敦金是具有显著杠杆效应的投资品种&#xff0c;参与其中的投资者&#xff0c;往往需要时刻关注它的实时行情走势&#xff0c;以及自己交易账户内的情况&#xff0c;才能及时地兑现利润和控制交易的风险。所以对于每一位伦敦金投资者来说&#xff0c;实时的行情报价都是十分重…

stable-diffusion 预训练模型汇总

目前各个github上各个库比较杂乱&#xff0c;故此做些整理方便查询 Stable UnCLIP 2.1 New stable diffusion finetune (Stable unCLIP 2.1, Hugging Face) at 768x768 resolution, based on SD2.1-768. This model allows for image variations and mixing operations as d…

OA办公系统如何通过审批流程提高效率

企业的发展与管理离不开信息化&#xff0c;很多企业的信息化都会选择从OA信息化开始。一个成熟先进的OA办公系统流程审批也是核心功能关注的功能之一&#xff0c;今天小编举例有18年平台经验的天翎低代码平台OA系统&#xff0c;给大家分享一下如果提升流程审批效率&#xff1a;…

展会回顾|万应低代码重磅亮相2023全球人工智能产品应用博览会

6月25-27日&#xff0c;人工智能领域的行业盛会——第五届全球人工智能产品应用博览会&#xff08;简称“全球智博会”&#xff09;在苏州国际博览中心成功举行。大会由苏州市人民政府指导、苏州工业园区管理委员会支持、新一代人工智能产业技术创新战略联盟、苏州市人工智能协…

Qt 事件过滤器使用QPainter绘制温度

文章目录 【1】eventFilter使用简介【2】QPainter使用简介【3】QPainter绘制温度案例头文件源文件 【4】 UI界面设计【5】温度绘制图 【1】eventFilter使用简介 Qt的eventFilter是一个事件过滤器&#xff0c;可以用来捕获和处理Qt对象的事件。事件过滤器可以被安装到一个对象上…

【js30天挑战】第四天:数组操作

总结 filter(筛选条件为true的项) map(你想要输出的东西)&#xff0c;进来多少个 出去多少个 sort()&#xff0c;默认可排字母顺序。sort(compareFn(a, b))其中compareFn(a, b)返回的值若大于0则a在b的后面。 reduce()&#xff0c;最复杂。reduce(func(){上一轮计算出的结果…

Vue 3 + vite技术架引入静态文件的问题(require和import方式)

Vue 3 vite技术架无法使用require()的方式引入静态文件 使用Vue 3 vite技术架开发过程中&#xff0c;引入静态资源时&#xff0c;习惯性使用require()引入&#xff0c;突然发现报错了。 研究了一下才发现&#xff0c;好像vite引入静态资源或者插件啥的&#xff0c;不用requi…

JAVA 二维码绘制,可定义背景图与在背景图种的位置,码点绘制避开logo区域10个像素点

效果图&#xff1a; 背景图&#xff1a; 直接看代码和代码说明&#xff1a; 方法drawQr() 为绘制核心&#xff0c;仅绘制出图上的二维码 方法createQr() 包含 读取背景图和 调用drawQr() 。绘制出完整的带有背景图的二维码 drawQr()方法参数说明&#xff1a; * param conten…

新星计划【数据结构与算法】赛道开启,欢迎报名!

前排提醒&#xff1a;这里是新星计划2023【数据结构与算法】学习方向的报名入口&#xff0c;一经报名&#xff0c;不可更换。 ↓↓↓报名方式&#xff1a;新星计划2023【数据结构与算法】学习方向报名入口&#xff01;-CSDN社区 一、关于本学习方向导师 博客昵称&#xff1a;…