最短编辑距离

news2024/9/29 11:40:57

最短编辑距离

  • 一、问题描述
  • 二、思路分析
    • 1、状态转移方程
    • (1)状态表示
    • (2)状态转移
    • 2、循环及初始化
    • (1)循环设计
    • (2)初始化处理
  • 三、代码实现

一、问题描述

在这里插入图片描述

二、思路分析

这道题是一道DP的问题,那么将从以下几个方面开始思考:

1、状态转移方程

(1)状态表示

状态表示通常情况下来源于问题,问题的规模通常揭示了状态的参数。这道题我们有两个字符串,两个字符串的长度决定了问题的规模,因此我们采用 f ( i , j ) f(i,j) f(i,j)来表示长度为 i i i的字符串 A A A,经过最小次数的变换,变成长度为 j j j的字符串 B B B

(2)状态转移

状态转移就是用子问题去解决当前问题,那么我们通过之前的做题经验,通常是利用 i − 1 i-1 i1或者 j − 1 j-1 j1来解决问题。

那么这道题也是一样的,我们的修改方式共有三种,增加,删除,替换

那么我们需要根据不同的情况去选择不同的修改方式。

如果字符串A的 i i i个字母和字符串的前 j − 1 j-1 j1个相同,那么我们就只需要在字符串A的末尾增加一个字符,那么此时我们的操作次数就会 + 1 +1 +1

如果字符串A的 i − 1 i-1 i1个字母和字符串B的 j j j个字符是相同的,那么说明我们字符串A的最后一个字符是多余的,此时我们就只需要删除字符串A的最后一个字符,此时操作次数+1。

如果字符串A的前 i − 1 i-1 i1个字母和字符串B的前 j − 1 j-1 j1个字符是相同的,那么我们只需要判断一下二者最后一个字母是否相等,如果相等的话,那么这两个字符串本身就是相同的,我们不需要进行任何的操作,如果二者不相同,我们只需要给字符串A的末尾字母替换成字符串B的最后一个字母即可,此时操作次数+1。

所以我们的状态转移方程可以写成:

f ( i , j ) = m a x { f ( i − 1 , j ) + 1 f ( i , j − 1 ) + 1 f ( i − 1 , j − 1 ) + 1 ( o r   0 ) f(i,j)=max \begin{cases} f(i-1,j)+1\\ f(i,j-1)+1\\ f(i-1,j-1)+1(or\ 0)\\ \end{cases} f(i,j)=max f(i1,j)+1f(i,j1)+1f(i1,j1)+1or 0

2、循环及初始化

(1)循环设计

循环设计可以从转移方程入手,想要处理 f ( i , j ) f(i,j) f(i,j),必须处理 f ( i − 1 , j ) f(i-1,j) f(i1,j), f ( i − 1 , j − 1 ) f(i-1,j-1) f(i1,j1), f ( i , j − 1 ) f(i,j-1) f(i,j1)

因此,外循环是 i i i从1到 n n n,内循环是 j j j从1到 m m m

(2)初始化处理

这道题的初始化就非常重要了,循环的最小起始值是1,所以 i − 1 i-1 i1 j − 1 j-1 j1分别为0的时候,就是最小的子问题。
因为我们需要用这些为0的情况,去推导出为1的情况才行。

那么我们看 f ( 0 , j ) f(0,j) f(0,j)的意思就是字符串 a a a为0个字符,去匹配字符串b的j个字符所需要的最小操作次数,很明显直接添加j次就可以了。即 f ( 0 , j ) = j f(0,j)=j f(0,j)=j

f ( i , 0 ) f(i,0) f(i,0)同理,字符串 a a a为i个字符,去匹配字符串b的0个字符所需要的最小操作次数,很明显直接删除i次就好了。即 f ( i , 0 ) = i f(i,0)=i f(i,0)=i

三、代码实现

#include<iostream>
using namespace std;
int n,m;
const int N=1100;
char s1[N],s2[N];
int f[N][N];
int main()
{
    scanf("%d%s%d%s",&n,s1+1,&m,s2+1);
    //初始化处理最小子问题
    for(int i=0;i<=m;i++)f[0][i]=i;
    for(int i=0;i<=n;i++)f[i][0]=i;
    
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            int nums=0;
            f[i][j]=min(f[i-1][j]+1,f[i][j-1]+1);
            if(s1[i]!=s2[j])nums=1;
            f[i][j]=min(f[i-1][j-1]+nums,f[i][j]);
        }
    }
    cout<<f[n][m]<<endl;
    return 0;
}

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

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

相关文章

oh my 毕设-人体姿态估计-简介应用场景

毕设题目为人体姿态估计&#xff0c;之前主要关注在目标检测上&#xff0c;这方面不太熟悉&#xff0c;于是想做一个系列专栏&#xff0c;从0到1学习姿态估计。 参考于大佬-同济子豪兄 姿态估计本质是关键点检测。 人体姿态的估计常常首先预测出人体各个关键点的位置坐标&am…

160.相交链表

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&…

开启 kerberos 后,HiveServer2 的 webui 没有内容的解决方案

开启 kerberos 后&#xff0c;HiveServer2 的 webui 没有内容。页面如下&#xff0c;可以打开&#xff0c;但是即便已经有会话&#xff0c;也有SQL执行&#xff0c;这里一直这样。 1. 原因分析 1.1 hiveserver2.jsp 以Active Sessions 的内容为例&#xff0c;./service/src…

electron起步基本和electron打包 无脑步骤(修改electron图标)

1.安装 yarn add electron --dev 和 yarn add nodemon --dev 2.在package.json 写main入口和启动脚本 "main":"main.js", "start": "nodemon --exec electron . --watch ./ --ext .js,.html,.css,.vue" "license": "…

oracle在本地创建数据库和导入DMP数据泵

第一步&#xff1a;创建本地数据库 databse Configuration Assistant&#xff0c;创建数据库。 下一步之后完成。 通常在创建数据库时会报错&#xff0c;如图&#xff0c;直接跳过&#xff0c;在net manager的Listener下添加一个新的地址&#xff0c;协议名填写警告日志中Prot…

关于mmpose

为什么是关于mmpose呢&#xff0c;因为我菜。本文仅做记录使用&#xff0c;也就是说&#xff0c;写的不一定对&#xff0c;欢迎大佬批评指正。 我只想知道这种关键点检测是如何标注的&#xff0c;数据集是如何搞的&#xff0c;全网居然都找不到&#xff0c;付费资源我不配&…

Android设计模式详解之装饰模式

前言 装饰模式也称为包装模式&#xff0c;结构型设计模式之一&#xff1b; 定义&#xff1a;动态地给一个对象添加一些额外的职责。就增加功能来说&#xff0c;装饰模式生成子类更为灵活&#xff1b; 使用场景&#xff1a;需要透明且动态地扩展类的功能时&#xff1b; UML类…

零经验出海报单,看跨境电商小白如何在Starday突出重围

随着大数据、云计算等一系列新颖先进的技术概念引入&#xff0c;全球经济市场呈现出以往难以想象的活跃&#xff0c;世界各地的贸易订单都可以借助互联网渠道在数秒内完成全流程。“跨境电商”这一概念正是全球互联网技术普及应用下的附属品&#xff0c;更是经济全球化时代发展…

第五章. 可视化数据分析图表—Seaborn图表(线性回归模型,箱型图,核密度图,提琴图)

第五章. 可视化数据分析图 5.7 Seaborn图表 Seaborn是一个基于Matplotlib的高级可视化效果库&#xff0c;偏向于统计图表&#xff0c;主要针对的是数据挖掘和机器学习中的变量特征选取&#xff0c;相比Matplotlib&#xff0c;他的语法相对简单&#xff0c;但是具有一定的局限性…

《Java高并发与集合框架》第三部分在高并发场景中工作的集合

《Java高并发与集合框架》第三部分在高并发场景中工作的集合前言1.高并发场景中的List、Map和Set集合1.1 CopyOnWriteArrayList1.2 CopyOnWriteArrayList不支持的使用场景1.3 CopyOnWriteArrayList主要方法1.4 java.util.Collections.synchronizedList()方法的补充作用1.4.1 Co…

Allegro如何实现交换pin操作详细指导

Allegro如何实现交换pin操作详细指导 在做PCB设计的时候,换pin是用的较多的功能,换pin可以让线序更加的顺,方便布线。但是前提是确保网络的交换是被允许的 下面用下图为例介绍Allegro中是如何实现交换pin的 具体操作如下 选择File选择Export-Libraries

2022年终,盘点IT行业全年10大事件

白云苍狗&#xff0c;一眨眼&#xff0c;2022年就来到了尾声。这一年里&#xff0c;IT行业发生了不少的大事。有喜有忧&#xff0c;令人目不暇接&#xff0c;显现出IT行业风云变幻的一面。 本期&#xff0c;知了姐为大家整理了近一年来&#xff0c;IT行业发生的10件大事。 NO…

Linux下安装mysql

下载地址&#xff1a; https://dev.mysql.com/downloads/mysql/ 1.解压mysql 文件包&#xff0c;解压路径/home/mysql tar -zxvf mysql-8.0.31-linux-glibc2.12-x86_64.tar 2.编写配置 [client] #password your_password port 3306 socket /home/mysql/…

无线网络监控分析工具

多年来&#xff0c;网络设备已经从房间大小的机器急剧转变为小型便携式设备。随着设备尺寸发生巨大变化&#xff0c;将这些设备相互连接所涉及的技术也发生了巨大变化。这些剧烈变化的结果是无线网络的形成。无线网络的优势在于网络中的各种设备之间不需要物理连接。此外&#…

GoLang ~ 远程调试

前提条件 在编译go项目时&#xff0c;使用​​go build -gcflags "all-N -l"​​&#xff0c;关闭内联优化&#xff0c;以支持debug。 关于​​-gcflags "-N -l"​​参数的解释&#xff1a; 编译时&#xff0c;如果编译的结果需要gdb调试则使用参数​​-…

ASEMI整流桥2W10,DB107S和KBP307封装参数对比

编辑-Z ASEMI整流桥2W10&#xff0c;DB107S和KBP307是很常见的型号&#xff0c;今天就把整流桥2W10&#xff0c;DB107S和KBP307的封装参数对比一小&#xff0c;以便大家在选型时有更好的参考。 2W10参数&#xff1a; 型号&#xff1a;2W10 封装&#xff1a;WOB-4 最大重复峰…

Redis实现全局唯一id,实现优惠卷秒杀的下单功能

Redis实现全局唯一id public class RedisIdWorker {private StringRedisTemplate stringRedisTemplate;public RedisIdWorker(StringRedisTemplate stringRedisTemplate) {this.stringRedisTemplate stringRedisTemplate;}//开始时间戳private static final long BEGIN_TIMEST…

Postman之接口关联

一、前言 在我们做接口测试时&#xff0c;绝大多数测试人员都会使用 Postman 来进行测试&#xff0c;因为 Postman 的易用性非常好。进行单接口测的时候十分方便&#xff0c;但是实际项目上很多接口都会有依赖关系&#xff0c;这使得每次接口请求前&#xff0c;都要先手动获取…

JMeter操作笔记

通过这个图&#xff0c;我们可以看到一个简单的计算逻辑&#xff1a; 1. 如果有 10000 个在线用户数&#xff0c;同时并发度是 1%&#xff0c;那显然并发用户数就是 100。 2. 如果每个线程的 20TPS&#xff0c;显然只需要 5 个线程就够了&#xff08;请注意&#xff0c;这里…

函数编程和Stream

在函数编程里用到了一些Lamada语法&#xff0c;因此要先了解一些lamada的内容&#xff0c;然后再了解函数编程&#xff0c;进一步再去了解stream 一、lamada使用语法 1.1、使用格式 lambda 表达式的语法格式如下&#xff1a; (parameters) -> expression 或 (parameters…