一本通 1276:【例9.20】编辑距离

news2025/7/15 19:50:10

看完题目后,整个人都懵了,这题咋整?

哎呀,知道知道,用动态规划做

不要慌,我们慢慢分析....


目录

做题前须知

状态转移

如果 a[i] == b[j]

如果 a[i] != b[j]

做删除操作

做插入操作

做替换操作

初始化

输出

最终代码


做题前须知

读完题发现要输出  让A字符串变为B字符串最少要几步

变化方式有3种  👇

  • 删除一个字符
  • 插入一个字符
  • 改变一个字符

注意啦!

只能改变A字符串

只能改变A字符串

只能改变A字符串!!!!

重要的事说3遍😁


状态转移

这题 dp[i][j] 代表 让a[1~i]变为b[1~j]字符串最少要几步 相信这个大家肯定都知道

那如何状态转移?

如果 a[i] == b[j]

假设每个字符串后面都是x

A  |-----------------------| x

B  |-----------------------| x

像这样👆      那俩 x 就根本不用管,所以操作数就等于dp[i-1][j-1]

第一个转台转移方程闪亮登场👇

dp[i][j] = dp[i-1][j-1]


如果 a[i] != b[j]

假设一个字符串后面是x,一个字符串后面是y

做删除操作

|--------------------------|  x

|-----------------------| y

我们是不是只要让a[1 ~ i-1] 和 b[1 ~ j] (淡蓝色部分) 相等然后再删除 ‘x' 就行了,所以...

dp[i][j] = dp[i-1][j] + 1

 为啥还加个1啊,删掉那个 ’x' 不就是一步嘛?所以还要 +1

做插入操作

|----------------------|  x

|-------------------------| y

我们是不是只要让a[1 ~ i] 和 b[1 ~ j-1] (淡蓝色部分) 相等然后再在A串结尾添加 'y' 就行了,所以...

 dp[i][j] = dp[i][j-1] + 1

做替换操作

|------------------------| x

|------------------------| y

我们是不是只要让a[1 ~ i-1] 和 b[1 ~ j-1] (淡蓝色部分) 相等然后再将A串结尾的 'x' 替换成 'y' 就行了,所以...

 dp[i][j] = dp[i-1][j-1] + 1

最后,只要将三个值算出来 再取个最小值 就可以赋值到dp[i][j]了

总结起来dp[i][j]的人生大概就是这样👇

                   /   a[i]==b[j]                    dp[i-1][j-1]

dp[i][j] ------                                   /   dp[i-1][j]       删除

                   \    a[i]!=b[j]   --min--|     dp[i][j-1]       插入

                                                     \  dp[i-1][j-1]    替换


初始化

状态方程考虑完了,接下来我们来想一想怎么初始化

一个空串变为b[1~i]要i步,为什么,一直在结尾插入不就完了

同样让a[1~i]变为空串也要i步,那i步不就是一直删除吧

所以可以得到

dp[i][0] = i

dp[0][i] = i


输出

cout << dp[n][m];

一痛分析下来,相信你已经会写了

还是不会的小伙伴跟我来!

最终代码

//【例9.20】编辑距离
#include <iostream>
#include <cstring>

using namespace std;

const int N = 2005;

int dp[N][N];
char a[N], b[N];

int main() {
	cin >> a + 1 >> b + 1;
	int n = strlen(a + 1), m = strlen(b + 1);

	for (int i = 0; i <= n; i ++)
		dp[i][0] = i;
	for (int i = 0; i <= m; i ++)
		dp[0][i] = i;

	for (int i = 1; i <= n; i ++) {
		for (int j = 1; j <= m; j ++) {
			if (a[i] == b[j]) //结尾相同
				dp[i][j] = dp[i - 1][j - 1];
			else {
				dp[i][j] = dp[i - 1][j] + 1; //删除
				dp[i][j] = min(dp[i][j], dp[i][j - 1] + 1); //插入
				dp[i][j] = min(dp[i][j], dp[i - 1][j - 1] + 1); //替换
				//在 删除 插入 替换 中 选出最优解
			}
		}
	}

	cout << dp[n][m];
	return 0;
}
/*
【输入样例】
sfdqxbw
gfdgw
【输出样例】
4
*/

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

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

相关文章

跑步热来袭!缤跃关注运动健康生活,跨界推出差异化酒店产品!

近期&#xff0c;人民数据研究院发布《2022全民跑步运动健康报告》&#xff0c;报告中显示参与跑步人群的年龄跨度随着社会对跑步运动不断攀升的热情而增加。现代生活节奏加快、竞争压力大使得部分中青年通过运动寻求解压&#xff0c;2022年18-40岁的跑者开始成为中坚力量&…

非零基础自学Golang 第15章 Go命令行工具 15.1 编译相关指令 15.1.3 install 15.1.4 交叉编译

非零基础自学Golang 文章目录非零基础自学Golang第15章 Go命令行工具15.1 编译相关指令15.1.3 install15.1.4 交叉编译第15章 Go命令行工具 15.1 编译相关指令 15.1.3 install go install命令的作用是编译后安装&#xff0c;该命令依赖于GOPATH&#xff0c;因此不能在独立的…

网上到处转行编程成功的,现实中真的容易吗?

首先&#xff0c;我先回答&#xff0c;转行编程真的这么简单么&#xff1f;答案是极其简单&#xff0c;但是也非常艰难。 这是一句正确的废话&#xff01; 其实&#xff0c;网上到处都是转行成功的案例。而我们现在也是在互联网上咨询&#xff0c;所以得到的答案会是什么答案…

转行IT,你需要了解的真实项目研发流程是怎样的?

本文以我在阿里写bug的项目流程为例子&#xff0c;介绍软件项目的研发一般流程&#xff0c;也可以作为企业开发流程的参考&#xff0c;让想转行IT的同学提前心里有个数。 一、职位分工 一般的大厂或者互联网软件公司&#xff0c;都会有如下职位。 1、产品经理 负责产品的设计&a…

json-server的学习笔记

文章目录json-server简介1、入门环境依赖安装2、基本使用2.1 启动jsonserver2.2 **json-server相关配置参数**2.3 jsonserver中的请求方法的作用3、筛选过滤4、分页5、排序6、切片(分页)7、特殊符号8、全文搜索9、关系10、数据库11、主页12、附加功能12.1 静态文件服务器12.2 替…

青少年等级考试【Python通关干货知识点】(一级)

青少年等级考试【Python通关干货知识点】&#xff08;一级&#xff09; 1. 编程模式 1&#xff09;交互式编程 在交互式环境的提示符>>>下&#xff0c;直接输入代码&#xff0c;按回车&#xff0c;就可以立刻得到代码执行结果。 交互式编程缺憾是没有保存下来&#x…

转行大数据,编程学Java还是Python?

Python和Java&#xff0c;是大数据行业最常见的两种编程语言&#xff0c;对于想转行大数据的人来说&#xff0c;学习哪个语言是比较好的选择呢&#xff1f; Python和大数据&#xff1a; Python本身的特点是高效率的开发和简单的维护&#xff0c;大数据运维领域也在普遍采用Pyth…

GridLayout案例

GridLayout-网格布局案例 1.网格布局-GridLayout 1.简介 无限细的线绘制的分割区域成行成列&#xff0c;和棋盘的样子差不多2.注意点 自己设置行数和列数自己控件在几行几列自己定义跨越的行数和列数自己设置子布局的排列的样式3.常见属性 4.网格布局属性 android:columnCount&…

【软件测试】测试人的懊恼,你要揭开的秘密复现bug......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 我们测试人常常会懊…

分布式微服务框架SpringCloud Alibaba学习(1)

springCloud 发展历史以及SpringCloud Alibaba概述 一.Why SpringCloud Alibaba? 1.微服务cloud新闻&#xff1a; 2020-12-22日Spring 官方博客宣布&#xff0c;Spring Cloud 2020.0.0正式发布。2020.0.0是第一个使用新的版本号命名方案的Spring Cloud 发行版本。在此之前S…

上次面试跪在了Redis上,刷完腾讯云大神亲码的“redis深度笔记”,终面进腾讯

前言 作为这个时代码代码的秃头人员&#xff0c;对Redis肯定是不陌生的&#xff0c;如果连Redis都没用过&#xff0c;还真不好意思出去面试&#xff0c;指不定被面试官吊打多少次。 毕竟现在互联网公司和一些创业公司都要用到Redis&#xff0c;像亚马逊、谷歌、阿里、腾讯都要使…

哈啰出行高质量故障复盘法:“3+5+3”(附模板)

# 一分钟精华速览 #故障复盘指的是及时把过去发生的错误&#xff0c;最大程度转化为未来可以规避的办法&#xff0c;其核心是不断减少失败因子繁衍的温床&#xff0c;将它们牢牢地掌控在不至于引发危机的范围之中。 作为国民基础设施的哈啰出行&#xff0c;在保障超5.3亿注册用…

按照等分份数或者分割点索引号列表将一个数组拆分为多个数组hsplit()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 按照等分份数或者分割点索引号列表 将一个数组拆分为多个数组 hsplit() [太阳]选择题 以下关于python代码表述有误的一项是? import numpy as np myArraynp.array([[0,1,2,3,4,5],[10,11,1…

“0基础、学历无优势、逻辑能力一般……”能转行做程序员吗?

此前&#xff0c;拉勾数据研究院对程序员群体做了一次深入调查&#xff0c;并发布了《2022程序员群体职场洞察报告》&#xff0c;报告显示&#xff0c;“高薪”依然是程序员的职业标签之一。在调查的程序员群体中&#xff0c;年薪在10-30万元之间的人数占比为66.7%&#xff0c;…

Sharding-JDBC(四)集成dynamic-datasource

目录1.Maven依赖2.yml配置3.DataSourceConfig.java4.TUserService.java5.TUserServiceImpl.java6.测试代码7.测试结果8.源码地址实现原理&#xff1a; 通过 DataSourceConfig.java 将ShardingJDBC数据源配置为动态数据源之一。通过 DS(DataSourceConfig.SHARDING_DATA_SOURCE_…

Coinbase Vntures:Web3社交堆栈指南

概述 Web3社交网络赋予用户对其数据、身份和关系的所有权及可移植性&#xff0c;同时支持无需许可的开发。 Web3社交堆栈有四层&#xff1a;托管、社交原语、profile和应用程序。 例如&#xff1a;Farcaster是一款类似twitter的社交应用程序&#xff0c;它创建在开放的社交图…

HTTPS协议的密钥交换流程

前言 HTTPS 常用的密钥交换算法有两种&#xff0c;分别是 RSA 和 ECDHE 算法。 其中&#xff0c;RSA 是比较传统的密钥交换算法&#xff0c;它不具备前向安全的性质&#xff0c;因此现在已很少服务器使用。而 ECDHE 算法具有前向安全&#xff0c;所以被广泛使用。 注&#xf…

18 | 如何处理k8s证书过期

目录1 证书过期2 常用命令2.1 使用统一命令查看2.2 查看apiserver.crt证书时间2.3 查看secret2.4 查看ingress3 k8s证书过期处理方法1 证书过期 证书在使用的过程中&#xff0c;通常是一年有效期&#xff0c;到期后&#xff0c;需要重新续期。 2 常用命令 2.1 使用统一命令查…

智慧车行预约小程序,汽车保养、维修、美容、检测预测小程序,前后端完整代码包括车行动态,养车常识,保养预约,维修预约,洗车美容预约

功能介绍 智慧车行小程序&#xff0c;是一个专门为洗车/4S/车辆维修行业打造的小程序&#xff0c;前后端完整代码包括车行动态&#xff0c;养车常识&#xff0c;保养预约&#xff0c;维修预约&#xff0c;洗车美容预约&#xff0c;汽车检测预约等功能&#xff0c;采用腾讯提供的…

分布式锁

目录 1. 模拟高并发场景秒杀下单 1.1 导入依赖 1.2 配置application.yml文件 1.3 场景模拟 1.4 案例演示 2. JVM级锁与redis级分布式锁 2.1 JVM级锁 3. redis级分布式锁 3.1 什么是setnx 3.2 场景分析 4. redisson分布式锁 4.1 什么是Redisson 4.2 Redisson工作原…