代码随想录刷题记录 day48 两个字符串的删除操作+编辑距离

news2025/1/23 21:13:45

代码随想录刷题记录 day48 两个字符串的删除操作+编辑距离

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

在这里插入图片描述

思想

两个元素都能删除了,还是考虑第i-1个字符和第j-1个字符是不是相同的,不相同的话考虑三种情况,删除i-1;删除j-1,同时删除

1.dp数组的定义
dp[i][j]表示以i-1为结尾的字符串word1,和以j-1结尾的字符串word2 相同 最小需要dp[i][i]步


2.递推公式
word1[i-1]==word2[j-1] 第i-1个字符和j-1个字符相等
2.1 可以匹配 i-2 和j-2的位置是否是相同的 dp[i][j]=dp[i-1][j-1]

2.2 word1[i-1]!=word2[j-1]
2.2.1 删除 word1[i-1] 匹配word1[i-2] 和 word2[j-1] dp[i][j]=dp[i-1][j]+1;
2.2.2 删除 word2[j-1] 匹配word1[i-1] 和 word2[j-2] dp[i][j]=dp[i][j-1]+1;
2.2.3 删除 word1[i-1]和word2[j-1] 匹配word1[i-2] 和 word2[j-2]  dp[i][j]=dp[i-1][j-1]+2
这三个当中取最小的

3.初始化
由递推公式可得 dp[i][j]是由 左边和上边 和斜上而来得  需要初始化dp[i][0]和dp[0][j]
dp[i][0]表示以i-1结尾得字符串 和空字符串相同  需要i步 那么同理dp[0][j]=j

4.遍历顺序 
从上到下 从前到后

5.数组打印

代码

class Solution {
    public int minDistance(String word1, String word2) {
        //每次只能删除操作

        //1.dp数组的定义
        //dp[i][j]表示以i-1为结尾的字符串word1,和以j-1结尾的字符串word2 相同 最小需要dp[i][i]步


        //2.递推公式
        //word1[i-1]==word2[j-1] 第i-1个字符和j-1个字符相等
        //2.1 可以匹配 i-2 和j-2的位置是否是相同的 dp[i][j]=dp[i-1][j-1]

        //2.2 word1[i-1]!=word2[j-1]
        //2.2.1 删除 word1[i-1] 匹配word1[i-2] 和 word2[j-1] dp[i][j]=dp[i-1][j]+1;
        //2.2.2 删除 word2[j-1] 匹配word1[i-1] 和 word2[j-2] dp[i][j]=dp[i][j-1]+1;
        //2.2.3 删除 word1[i-1]和word2[j-1] 匹配word1[i-2] 和 word2[j-2]  dp[i][j]=dp[i-1][j-1]+2
        //这三个当中取最大的一个

        //3.初始化
        //由递推公式可得 dp[i][j]是由 左边和上边 和斜上而来得  需要初始化dp[i][0]和dp[0][j]
        //dp[i][0]表示以i-1结尾得字符串 和空字符串相同  需要i步 那么同理dp[0][j]=j
        int[][] dp=new int[word1.length()+1][word2.length()+1];
        for(int i=0;i<word1.length()+1;i++){
            dp[i][0]=i;
        }
        for(int j=0;j<word2.length()+1;j++){
            dp[0][j]=j;
        }
        //4.遍历顺序 从上到下 从左到右
        for(int i=1;i<word1.length()+1;i++){
            for(int j=1;j<word2.length()+1;j++){
                if(word1.charAt(i-1)==word2.charAt(j-1)){
                    dp[i][j]=dp[i-1][j-1];
                }else{
                    dp[i][j]=Math.min(dp[i-1][j]+1,Math.min(dp[i][j-1]+1,dp[i-1][j-1]+2));
                }
            }
        }

        return dp[word1.length()][word2.length()];

    }
}

72. 编辑距离

在这里插入图片描述

思想

和前面几题的区别就是这道题目 其中一个字符串可以 插入删除 替换了

插入和删除的操作可以看成一个操作 即word1增加一个元素 等于word2删除一个元素

替换字符串 就匹配i-2 和j-2

1.dp数组得定义
dp[i][j]表示以i-1为结尾得字符串word1转换成以j-1结尾的字符串word2的最少的操作次数

2.递推公式
2.1 word1[i-1]==word2[j-1] dp[i][j]=dp[i-1][j-1] 即对这一个字符串不需要进行任何的操作
2.2 word1[i-1]!=word2[j-1] 
2.2.1 删除元素
 删除word1[i-1] dp[i][j]=dp[i-1][j]+1;
 删除word2[j-1] dp[i][j]=dp[i][j-1]+1;

2.2.2添加元素
word1添加元素等于word2删除一个元素 是一样的 所以可以省略

2.2.3替换元素 去匹配i-2和j-2就好了
dp[i][j]=dp[i-1][j-1]+1;

3.初始化 dp[i][0] dp[0][j]

4.遍历顺序 从上到下 从左至右

5.dp数组的打印

代码

class Solution {
    public int minDistance(String word1, String word2) {
        //1.dp数组得定义
        //dp[i][j]表示以i-1为结尾得字符串word1转换成以j-1结尾的字符串word2的最少的操作次数

        //2.递推公式
        //2.1 word1[i-1]==word2[j-1] dp[i][j]=dp[i-1][j-1] 即对这一个字符串不需要进行任何的操作
        //2.2 word1[i-1]!=word2[j-1] 
        //2.2.1 删除元素
        // 删除word1[i-1] dp[i][j]=dp[i-1][j]+1;
        // 删除word2[j-1] dp[i][j]=dp[i][j-1]+1;

        //2.2.2添加元素
        //word1添加元素等于word2删除一个元素 是一样的 所以可以省略

        //2.2.3替换元素 去匹配i-2和j-2就好了
        //dp[i][j]=dp[i-1][j-1]+1;

        //3.初始化 dp[i][0] dp[0][j]
        int[][] dp=new int[word1.length()+1][word2.length()+1];

        for(int i=0;i<word1.length()+1;i++){
            dp[i][0]=i;
        }
        for(int j=0;j<word2.length()+1;j++){
            dp[0][j]=j;
        }

        //4.遍历顺序 从上到下 从左至右
        for(int i=1;i<word1.length()+1;i++){
            for(int j=1;j<word2.length()+1;j++){
                if(word1.charAt(i-1)==word2.charAt(j-1)){
                    dp[i][j]=dp[i-1][j-1];
                }else{
                    dp[i][j]=Math.min(dp[i-1][j]+1,Math.min(dp[i][j-1]+1,dp[i-1][j-1]+1));
                }
            }
        }

        return dp[word1.length()][word2.length()];

    }
}

编辑距离总结

此类的题目基本上都是 一个字符串str1变成另外一个字符串str2所需要的最小的步数

衍生出不同的限制,比如:

1.判断子序列 str1 能够变为str2

2.不同的子序列 str1有多少种变为str2的方法,str2可以删除

3.两个字符串的删除操作 str1变成str2 最少的步数 str1和str2都可以删除

4.编辑距离,str1变成str2,str1可以删除、添加、替换元素

参考:代码随想录

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

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

相关文章

css实现鼠标禁用(鼠标滑过显示红色禁止符号)

css实现鼠标禁用&#xff08;鼠标滑过显示红色禁止符号&#xff09;创作背景css鼠标禁用创作背景 从本文开始&#xff0c;将会用三篇文章来一步一步实现vueantdts实战后台管理系统中table表格的不可控操作。中间会补充两篇css知识文章&#xff0c;方便后续功能的实现。实现表格…

非零基础自学Golang 第14章 反射 14.2 基本用法 14.2.2 获取类型的值 14.2.3 使用反射调用函数

非零基础自学Golang 文章目录非零基础自学Golang第14章 反射14.2 基本用法14.2.2 获取类型的值14.2.3 使用反射调用函数第14章 反射 14.2 基本用法 14.2.2 获取类型的值 Go语言使用reflect.TypeOf来获取类型信息&#xff0c;使用reflect.ValueOf来获取变量值的信息。 refle…

云原生|kubernetes|CKA真题解析-------(6-10题)

第六题&#xff1a; service配置 解析&#xff1a; 考察两个知识点&#xff1a; deployment控制器内的port命名 暴露一个pod内的端口到新建的服务内的 这里有一个需要注意的地方&#xff0c;没有告诉你deployment控制器在哪个namespace。假设这个front-end这个pod是在A这个…

前端CSS Flex布局8大重难点知识,收藏起来吧

2009年&#xff0c;W3C提出了一种新的方案—-Flex布局&#xff0c;可以简便、完整、响应式地实现各种页面布局。目前&#xff0c;它已经得到了所有浏览器的支持&#xff0c;这意味着&#xff0c;现在就能很安全地使用这项功能。 Flex布局将成为未来布局的首选方案。这也是学习前…

Spring之底层架构核心概念-BeanDefinition

目录1.什么是BeanDefinition&#xff1f;2.如何生成BeanDefinition?2.1. Component2.1. bean标签2.3. Bean注解2.4. AbstractBeanDefinition2.5. 利用BeanDefinition 读取器-解析类2.6. XmlBeanDefinitionReader - 解析 xml文件2.7. ClassPathBeanDefinitionScanner 扫描生成 …

2022年度回顾 | 技术篇:突破公链不可能三角的努力

2022年接近尾声&#xff0c;驻足回看行业这一年的跌宕起伏&#xff0c;无论是技术的突破&#xff0c;应用的创新&#xff0c;还是生态的兴衰&#xff0c;皆成为了行业发展的历史注脚。如往年一样&#xff0c;万向区块链于年末推出重磅年度回顾系列文章&#xff1a;《公链技术篇…

一款免费的开源的 Switch 模拟器,支持超过3200款游戏

一款免费的开源的 Switch 模拟器&#xff0c;支持超过3200款游戏。 Ryujinx是一个开源的任天堂Switch模拟器&#xff0c;由gdkchan创建&#xff0c;用C#编写。该模拟器旨在提供卓越的准确性和性能、用户友好的界面和一致的构建。它是从头开始编写的&#xff0c;于2017年9月开始…

深度学习——锚框(笔记)

1.锚框的解释 目标检测算法中&#xff0c;通常会在输入图像中采样大量区域&#xff0c;然后判断这些区域是否包含所感兴趣的目标&#xff0c;并调整区域边界从而更加准确的预测目标真实的边缘框。 ①一类目标检测算法是基于锚框的 ②提出多个框被称为锚框的区域&#xff08;…

GIS开发入坑(三)--QGIS制作行政区划及背景图层

QGIS&#xff0c;功能强大的GIS工具&#xff0c;地理信息开发中的必备神器&#xff0c;今天以南京市为例制作行政区划并使用电子地图为数字底图进行呈现。 1.获取行政区划数据 阿里云的可视化平台提供了便捷的中国行政区划数据获取方式&#xff0c;数据层级最小到区县级。 htt…

游戏视频录制用什么软件?这2款软件,用过都说好

小编相信很多朋友在游戏中都有精彩的操作。有些朋友想和朋友分享他们在游戏中的精彩操作&#xff0c;但他们不知道有什么容易使用的免费游戏视频录制软件&#xff0c;可以记录他们在游戏中的亮眼表现。那么&#xff0c;哪个电脑游戏视频录制软件容易使用和免费呢&#xff1f;接…

【树莓派不吃灰】兄弟连篇⑤ 服务管理

目录1、服务分类2、rpm安装服务&#xff08;旧版本系统&#xff09;3、源码包安装&#xff08;旧版本系统&#xff09;❤️ 博客主页 单片机菜鸟哥&#xff0c;一个野生非专业硬件IOT爱好者 ❤️❤️ 本篇创建记录 2022-12-20 ❤️❤️ 本篇更新记录 2022-12-20 ❤️&#x1f3…

环境多介质逸度模型实践技术与典型案例【代码】应用

随着污染物在各种环境中的迁移和转化&#xff0c;多介质污染物模型日益受到关注。在各类多介质模型中&#xff0c;基于逸度概念的逸度模型由于运用范围广&#xff0c;建模数据要求较低而广受欢迎。 【原文链接】&#xff1a; 环境多介质逸度模型实践技术与典型案例【代码】应用…

《集体智慧编程》笔记(4 / 12):搜索与排名

由于书本未提供数据文件且提供的链接无法被链接且pysqlite安装失败&#xff0c;所以本章只是阅读学习。 文章目录搜索引擎的组成一个简单的爬虫程序使用urllib2爬虫程序的代码建立索引建立数据库Schema在网页中查找单词加入索引查询基于内容的排名归一化函数单词频度文档位置单…

JAVA面试(关于技术深耕方向和职业规划)

人的精力有限&#xff0c;制定清晰明确的技术发展方向&#xff0c;会使自己少走很多弯路。经过快10年的工作&#xff0c;我现在主要给自己在技术上定了这几个方向。 1、专注JAVA开发。 2、专注JAVA架构。 3、专注JAVA项目运维。 4、专注数字化业务项目。 5、专注JAVA项目的…

Springboot事件监听+@Async注解

文章目录一、不求甚解二、人云亦云三、刨根问底四、曲突徙薪一、不求甚解 在开发中经常可以利用Spring事件监听来实现观察者模式&#xff0c;进行一些非事务性的操作&#xff0c;如记录日志之类的。 Controller Controller中注入ApplicationEventPublisher&#xff0c;并利用…

内科大软件工程导论复习内容笔记

文章目录一、 概念&#xff08;共60分&#xff0c;单选题、多选题&#xff09;1. 软件是程序、数据、文档的集合。2. 软件的分类&#xff08;按规模、性质分&#xff09;3. 软件危机的表现、缓解软件危机的途径4. 软件工程方法学主要有两种&#xff1a;结构化的软件工程方法学_…

借助 Material Design,帮助您打造更好的无障碍应用 (上篇)

随着时代的发展&#xff0c;"无障碍体验" 对开发者的意义也愈发重大。我们准备了无障碍设计文章&#xff0c;帮助您为更多用户打造精彩应用。本文是第一篇内容&#xff0c;将为您介绍辅助技术&#xff0c;层次结构&#xff0c;颜色和对比度等内容。了解无障碍改进产品…

[前端攻坚]:Set的使用

总结一些日常需要用到的一些api&#xff0c;也是在一些面试中会经常出现的题目&#xff0c;今天分享的是Set的一些用法和个人的一些理解&#xff0c; 同时文章也被收录到我的《JS基础》专栏中&#xff0c;欢迎大家点击收藏加关注。 我们知道Set是一种叫做集合的数据结构&#x…

手把手教你成为荣耀开发者:如何获取平台帮助及最新通知?

荣耀开发者服务平台是荣耀面向开发者的统一生态入口&#xff0c;通过聚合周边内外部系统&#xff0c;分全球多站点部署&#xff0c;为全球开发者提供业务全生命周期的商业支撑服务&#xff0c;拥有应用分发、智慧服务、开放能力、HONOR Connect等众多业务等您来合作。 在与荣耀…

引擎入门 | Unity UI简介–第3部分(2)

本期我们继续为大家进行【Unity UI简介–第3部分】的后续教程 学习内容 4.添加遮挡面板 5.添加内容面板 6.添加按钮 文章末尾可免费获取教程源代码 本篇【Unity UI简介–第3部分】篇幅较长&#xff0c;分为八篇&#xff0c;本篇为第二篇&#xff0c;还未看过第一篇的请点…