想要精通算法和SQL的成长之路 - 编辑距离

news2024/11/21 2:38:37

想要精通算法和SQL的成长之路 - 编辑距离

  • 前言
  • 一. 编辑距离
    • 1.1 定义动态规划数组
    • 1.2 定义动态规划方程
    • 1.3 定义数组的初始化
    • 1.4 最终答案

前言

想要精通算法和SQL的成长之路 - 系列导航

一. 编辑距离

原题链接

给你两个单词 word1word2, 请返回将 word1 转换成 word2 所使用的最少操作数。你可以对一个单词进行如下三种操作:

  • 插入一个字符
  • 删除一个字符
  • 替换一个字符

示例 1:

  • 输入:word1 = “horse”, word2 = “ros”
  • 输出:3
  • 解释:horse -> rorse (将 ‘h’ 替换为 ‘r’)。rorse -> rose (删除 ‘r’)。rose -> ros (删除 ‘e’)

思路:遇到这种两个字符之间的序列、替换等问题。往往我们都是用动态规划。

1.1 定义动态规划数组

第一步:先来定义二维数组dp[i][j]:代表 word1 到第 i 位转化成 word2j 位最少需要的步数。

1.2 定义动态规划方程

第二步:就是规定动态规划方程公式了。这里有两种情况:

  • 第一种:word1[i] == word2[j] ,那么这种情况下就不需要插入/删除/替换。即dp[i][j] = dp[i-1][j-1]
  • 第二种:word1[i] != word2[j],那么这种情况又要单独分析。

我们来看上述第二种情况,当word1[i] != word2[j]的时候,根据题目提示,我们有三种选择:

  1. word1当前位置插入: 相当于word1i的位置转化成word2j-1的位置所需要的最小步数再加1。即dp[i][j] = dp[i][j-1] + 1。(word1插入,相当于word2删除。反之同理)
  2. word1当前位置删除:相当于word1i-1的位置转化成word2j的位置所需要的最小步数再加1。即dp[i][j] = dp[i-1][j] + 1。(word1删除,相当于word2插入。反之同理)
  3. word1当前位置替换:那么元素的个数就不用改变。当于word1i-1的位置转化成word2j-1的位置所需要的最小步数再加1。即dp[i][j] = dp[i-1][j-1] + 1

但是总的来说,我们要求得最小步数 ,就应该对上述三种情况取最值。即最小值。

  • dp[i][j] = min( dp[i-1][j] ,dp[i][j-1] ,dp[i-1][j-1] ) + 1

那么这部分代码就是:

for (int i = 1; i <= n1; i++) {
    for (int j = 1; j <= n2; 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 - 1][j], dp[i][j - 1])) + 1;
        }
    }
}

最终结果返回:dp[word1.length()][word2.length()]

1.3 定义数组的初始化

第三步:我们应该对dp数组进行初始化。这里引用leetcode上一位大佬的图:

在这里插入图片描述

先说下红色框起来的部分:

  1. 第一列代表word1每个位置的元素。第一行代表word2每个位置的元素。
  2. 都包括空字符串。

再说下中间的数字部分(代表word1的第i位到word2的第j位转换所需的最少步数):

  1. 第一行:0,1,2,3。此时word1是空字符串,到word2的转换只能是插入操作。
  2. 第一列:0,1,2,3,4,5。此时word2是空字符串,word1word2的转换只能是删除操作。

那么初始化操作显而易见:

int n1 = word1.length(), n2 = word2.length();
int[][] dp = new int[n1 + 1][n2 + 1];
// 初始化,第一行
for (int j = 1; j <= n2; j++) {
    dp[0][j] = j;
}
// 初始化第一列
for (int i = 1; i <= n1; i++) {
    dp[i][0] = i;
}

1.4 最终答案

public int minDistance(String word1, String word2) {
    int n1 = word1.length(), n2 = word2.length();
    int[][] dp = new int[n1 + 1][n2 + 1];
    // 初始化,第一行
    for (int j = 1; j <= n2; j++) {
        dp[0][j] = j;
    }
    // 初始化第一列
    for (int i = 1; i <= n1; i++) {
        dp[i][0] = i;
    }
    for (int i = 1; i <= n1; i++) {
        for (int j = 1; j <= n2; 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 - 1][j], dp[i][j - 1])) + 1;
            }
        }
    }
    return dp[n1][n2];
}

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

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

相关文章

DataFactory根据字段类型在mysql插入数据

目录 插入Varchar类型数据 场景一&#xff1a;主键使用uuid 场景二&#xff1a;从外部导入数据 场景三&#xff1a;使用组合方式 插入data类型日期数据 插入Varchar类型数据 insert value from an data table &#xff1a;表示可以通过外部数据创建数据表插入字符串值 i…

实验二B 图像的空域与频域滤波(源代码一站式复制粘贴)

实验二B 图像的空域与频域滤波一、实验目的二、实验原理三、实验内容与要求四、实验的具体实现一、实验目的 1.掌握图像滤波的基本定义及目的。 2.理解空间域滤波的基本原理及方法。 3.掌握进行图像的空域滤波的方法。 4.掌握傅里叶变换及逆变换的基本原理方法。 5.理解频域滤…

算法刷题打卡第52天:排序数组---桶排序

排序数组 难度&#xff1a;中等 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 示例 1&#xff1a; 输入&#xff1a;nums [5,2,3,1] 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;nums [5,1,1,2,0,0] 输出&#xff1a;[0,0,1,1,2,5]桶排序…

2022 CSDN 客服年终总结

hello&#xff0c;大家好&#xff0c;这里是《听用户心声&#xff0c;解用户之需》之 2022 年终总结篇。 秉承“用户至上”的服务理念&#xff0c;为了给用户提供极致的服务体验而时刻努力着&#xff0c;2022年&#xff0c;在大家的一致努力下&#xff0c;究竟有何成效呢&#…

SpringBoot1:helloword、导入依赖、配置项设置,打包方法、lombok、dev-tools、Spring Initailizr、常见注解

1.简介 简化Spring开发的一个框架。对整个Spring技术栈的大整合 J2EE企业级开发的一站式解决方案。 2.微服务 一个应用应该是一组小型服务&#xff0c;可以通过HTTP的方式来进行互通 每一个功能元素都是可独立替换&#xff0c;和独立升级的软件单元。 3.HelloWord 功能&am…

Stm32标准库函数5——OV2640 PA0-7 F103C8T6 4500000 联合VB 高分辨率

stm32f103c8t6串口发送 OV2640的图像&#xff0c;分辨率可选。网络上资料大部分是低分辨率的&#xff0c;这个可以做高分辨率 完整工程打包&#xff0c;包含VB串口显示界面&#xff1a; https://download.csdn.net/download/fengyuzhe13/87327054https://download.csdn.net/do…

【经典问题:HanoiTower(汉诺塔)】

&#x1f381;HanoiTower&#x1f385;HanoiTower问题描述&#x1f385;&#x1f385;模拟推导&#x1f385;&#x1f385;&#x1f385;问题的两种形式&#x1f384;求解移动总次数&#x1f384;&#x1f384;打印详细的移动过程&#x1f385;HanoiTower问题描述 汉诺塔问题&a…

基于HMM模型实现中文分词

任务描述:在理解中文文本的语义时需要进行分词处理,分词算法包括字符串匹配算法,基于统计的机器学习算法两大类。本案例在前文将说明常用分词库及其简单应用,之后会通过中文分词的例子介绍和实现一个基于统计的中文分词方法——HMM模型,该模型能很好地处理歧义和未登录词问…

[含文档+源码等]基于SSM实现的宿舍公共财产管理系统|寝室

博主介绍&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 项目名称 [含文档源码等]基于SSM实现的宿舍公共财产管理系统|寝室 演示视频 [含文档源码等]基于SSM实现的宿舍公共财产管理系统|寝室_哔哩哔哩_bilibili 系统介…

经济低迷形势下,如何降低软件开发成本?

1、选对开发方法 过程决定结果。方法错了&#xff0c;再有经验的人&#xff0c;结果也不会好。例如&#xff0c;软件开发方法从70年代的瀑布&#xff0c;一步步从迭代、快速原型等进化到现在的敏捷、规模化敏捷、DevOps等。统计数字显示&#xff0c;使用敏捷方法&#xff0c;平…

Excel中实现时间相减,得到间隔时间(年月日时分秒)

一、年月日之差 表中有开始日期和结束日期&#xff0c;我们在D3单元格中输入“C3-B3” 于是&#xff0c;得到下面的结果 很显然&#xff0c;结果并不是我们想要的。说明这种方法不行&#xff0c;为了得到两个日期之间的时间间隔&#xff0c;需要用到DATEDIF函数。先来说下DATED…

我国融资性担保行业整体呈减量提质趋势 国家“出手”解决行业痛点

根据观研报告网发布的《中国融资性担保行业发展趋势分析与投资前景预测报告&#xff08;2022-2029年&#xff09;》显示&#xff0c;融资性担保行业是指担保人与银行业金融机构等债权人约定&#xff0c;当被担保人不履行对债权人负有的融资性债务时&#xff0c;由担保人依法承担…

Go:使用 go-micro 构建微服务(一)

一、微服务 什么是微服务&#xff08;microservice&#xff09;&#xff1f;这是企业界正在向计算界提出的问题。一个产品的可持续性取决于它的可修改程度。 大型产品如果不能正常维护&#xff0c;就需要在某个时间点停机维护。而微服务架构用细化的服务取代了传统的单体服务…

语音识别芯片LD3320介绍再续

语音识别芯片LD3320驱动程序 1、芯片复位 复位就是对LD3320芯片的第47腿&#xff08;RSTB*&#xff09;发送低电平&#xff0c;然后需要对片选CS做一次拉低→拉 高的操作&#xff0c;以激活内部DSP。按照以下顺序&#xff1a; void LD_reset() { RSTB1;delay(1);RSTB0;delay…

TencentOS 3.1下安装zabbix 5.0.30

TencentOS是使用官方镜像文件安装的虚拟机。 虚拟机为virtualBox 6.1 zabbix 使用zabbix官方安装包编译安装。 下载地址: Download Zabbix sources zabbix软件包解包,本次安装解包在/opt下 zabbix需要nginx、php、mysql等软件支持,因此先安装它们。 安装mysql如下: yu…

Usaco Training刷怪旅 第二层第二题:Transformations

usaco training 关注我持续更新usaco training A square pattern of size N x N (1 < N < 10) black and white square tiles is transformed into another square pattern. Write a program that will recognize the minimum transformation that has been applied to t…

QCon直击|闲鱼推荐大规模应用背后的工程实践

讲师介绍闲鱼技术部 | 吴白万小勇&#xff08;吴白&#xff09;&#xff0c;闲鱼服务端专家。毕业于南京大学计算机系&#xff0c;目前负责闲鱼技术推荐架构。推荐在闲鱼的应用不同于搜索的确定性&#xff0c;推荐场景面临的问题往往是不确定的。但是正是因为这种不确定&#x…

Kafka无法对外暴露端口的相关解决方案

1、kafka开放外部访问 1.1、修改kafka configMap 修改内容如下 # 修改EXTERNAL_ACCESS_IP变量&#xff0c;值为真实的外网IP export EXTERNAL_ACCESS_IP${真实的外网IP} 1.2、重启kafka # 重启kafka kubectl rollout restart statefulset kafka -n default # 查看kafka状态 k…

盛邦安全将于12月27日上会,2022年前三季度收入1亿元

12月20日&#xff0c;上海证券交易所披露的科创板上市委2022年第112次审议会议公告显示&#xff0c;远江盛邦&#xff08;北京&#xff09;网络安全科技股份有限公司&#xff08;下称“盛邦安全”&#xff09;将于2022年12月27日上会。 目前&#xff0c;盛邦安全已经提交了招股…

在tushare量化平台可以获取哪些数据?

沪深股票数据是Tushare量化最传统、最具历史意义的数据服务项目从一开始就为投资者特别是定量投资者提供了稳定、方便的接口。 1.基础数据 提供交易和回测所需要的基础信息&#xff0c;目前主要提供的是上市公司股票列表和交易日历等 2.行情数据 行情数据目前还在继续规则和…