acwing 902. 最短编辑距离
地址 https://www.acwing.com/problem/content/904/
给定两个字符串A和B,现在要将A经过若干操作变为B,可进行的操作有:
- 删除–将字符串A中的某个字符删除。
- 插入–在字符串A的某个位置插入某个字符。
- 替换–将字符串A中的某个字符替换为另一个字符。
现在请你求出,将A变为B至少需要进行多少次操作。
输入格式
第一行包含整数n,表示字符串A的长度。
第二行包含一个长度为n的字符串A。
第三行包含整数m,表示字符串B的长度。
第四行包含一个长度为m的字符串B。
字符串中均只包含大写字母。
输出格式
输出一个整数,表示最少操作次数。
数据范围
1≤n,m≤1000
输入样例: AGTCTGACGC AGTAAGTAGGC
输出样例:
解法
动态规划
f[i][j] 表示 a[1-i]变化到b[1-j]最小的变化次数
那么首先最容易得到的变化次数就是
a长度=i b长度=0
a长度=0 b长度=0
f[0][j] 若b为j长度 a为0 则a需要增加j次才能变成b
f[i][0] 若a为i长度 b为0 则a需要删除i次才能编程b
接下来进行分析各种情况
a=i b=j
1 若 a需要删除最后的字母才能变成b 那么就有了 a[1~i-1] == b[1-j] 的前提
2 若 a需要最后增加一个字母才能变成b 那么就有了 a[1-i] == b[1-j+1] 的前提
3 若 a需要改动最后一个字母才能变成b 那么就有了 a[1-i-1] == b[1-j-1] 的前提
第3种情况中 若 a[i] == b[j] 则 此时的最小操作数就可能等于 dp[i-1][j-1]的操作数
代码流程就是
f[i][j] = min(f[i-][j]+,f[i][j-]+);
if(a[i] == b[j]) f[i][j] = min(f[i][j],f[i-][j-]);
else f[i][j] = min(f[i][j],f[i-][j-]+);
全部代码如下
#include <iostream> using namespace std; const int N = ;
int n,m;
char a[N],b[N];
int f[N][N]; //f[i][j] 表示 a[1-i]变化到b[1-j]最小的变化次数 int main()
{
scanf("%d%s",&n,a+);
scanf("%d%s",&m,b+); //首先初始化 f[i][0] f[j][0]
//f[0][j] 若b为j长度 a为0 则a需要增加j次才能变成b
//f[i][0] 若a为i长度 b为0 则a需要删除i次才能编程b
for(int i =;i <= n;i++) f[i][] = i;
for(int i = ; i <= m;i++) f[][i] = i; for(int i =;i <= n;i++){
for(int j = ;j <=m;j++){
f[i][j] = min(f[i-][j]+,f[i][j-]+);
if(a[i] == b[j]) f[i][j] = min(f[i][j],f[i-][j-]);
else f[i][j] = min(f[i][j],f[i-][j-]+);
}
} cout << f[n][m] << endl; return ;
}
acwing 902. 最短编辑距离的更多相关文章
- POJ_3356——最短编辑距离,动态规划
Description Let x and y be two strings over some finite alphabet A. We would like to transform x int ...
- AcWing 91. 最短Hamilton路径
今天第一次在\(AcWing\)这个网站上做题,来发一下此网站的第一篇题解 传送门 思路 直接枚举的话时间复杂度为\(O(n*n!)\) 复杂度显然爆炸,所以我们用二进制枚举,这样就可以把复杂度降到\ ...
- (5千字)由浅入深讲解动态规划(JS版)-钢条切割,最大公共子序列,最短编辑距离
斐波拉契数列 首先我们来看看斐波拉契数列,这是一个大家都很熟悉的数列: // f = [1, 1, 2, 3, 5, 8] f(1) = 1; f(2) = 1; f(n) = f(n-1) + f( ...
- [LeetCode] 72. Edit Distance(最短编辑距离)
传送门 Description Given two words word1 and word2, find the minimum number of steps required to conver ...
- AcWing 1140. 最短网络
农夫约翰被选为他们镇的镇长! 他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场. 约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场. 约翰的农场的编号是1,其他农场 ...
- POJ 3356(最短编辑距离问题)
POJ - 3356 AGTC Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Desc ...
- 题解【AcWing902】最短编辑距离
题面 经典的最长公共子序列模型. 我们设 \(dp_{i,j}\) 表示 \(a_{1...i}\) 与 \(b_{1...j}\) 匹配上所需的最少操作数. 考虑删除操作,我们将 \(a_i\) 删 ...
- stanford NLP学习笔记3:最小编辑距离(Minimum Edit Distance)
I. 最小编辑距离的定义 最小编辑距离旨在定义两个字符串之间的相似度(word similarity).定义相似度可以用于拼写纠错,计算生物学上的序列比对,机器翻译,信息提取,语音识别等. 编辑距离就 ...
- 编辑距离算法详解:Levenshtein Distance算法
算法基本原理:假设我们可以使用d[ i , j ]个步骤(可以使用一个二维数组保存这个值),表示将串s[ 1…i ] 转换为 串t [ 1…j ]所需要的最少步骤个数,那么,在最基本的情况下,即在i等 ...
随机推荐
- C# 网络编程之简易聊天示例
还记得刚刚开始接触编程开发时,傻傻的将网站开发和网络编程混为一谈,常常因分不清楚而引为笑柄.后来勉强分清楚,又因为各种各样的协议端口之类的名词而倍感神秘,所以为了揭开网络编程的神秘面纱,本文尝试以一个 ...
- Java生鲜电商平台-高可用微服务系统如何设计?
Java生鲜电商平台-高可用微服务系统如何设计? 说明:Java生鲜电商平台高可用架构往往有以下的要求: 高可用.这类的系统往往需要保持一定的 SLA,7*24 时不间断运行不代表完全不挂,而是有一定 ...
- MinU: v2 Vulnhub Walkthrough
主机层面扫描: 22 和 3306 端口 3306 端口默认是MySQL端口,但是这里尝试爆破报错,最后通http访问发现非MySQL协议,而是一个http的服务 http的协议我们进行目录枚举下 枚 ...
- Tornado—接口调用时方法执行顺序
import tornado.web # web服务 import tornado.ioloop # I/O 时间循环 class MainHandler(tornado.web.RequestHan ...
- mybatis基础 笔记
Mybatis依赖<!--测试--> <dependency> <groupId>junit</groupId> <artif ...
- linux 启动jar包 指定yml配置文件和输入日志文件
命令为: nohup java -jar project.jar --spring.config.location=/home/project-conf/application.yml > ...
- PC上装VM上装虚拟机
1.虚拟机网卡选择桥接模式 2.查看本PC机的网络 3.到/etc/sysconfig/network-scripts,修改网卡,vi ifcfg-ens33 4.重新/etc/init.d/netw ...
- 生成对抗性网络GAN
同VAE模型类似,GAN模型也包含了一对子模型.GAN的名字中包含一个对抗的概念,为了体现对抗这个概念,除了生成模型,其中还有另外一个模型帮助生成模型更好地学习观测数据的条件分布.这个模型可以称作判别 ...
- R-4 方差分析
本节内容: 1:方差分析的原理 2:单因数方差分析 .双因数分析 3:交互项 一:方差分析是原理 方差分析原理 对总体均值的假设检验,有三种情况:1.总体均值与某个常数进行比较:2.两个总体均值之间的 ...
- 关于Git和GitHub的一些知识
git是分布式的版本控制工具,可离线,svn是集中式的,要联网操作.集中式的所有数据都放在服务器端,如果服务器宕机,则历史记录也可能就丢失了,这叫做单点故障.分布式的数据可直接保存在客户端. 为何要版 ...