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#使用Linq to csv读取.csv文件数据2_处理含有非列名数据的方法(说明信息等)
第一篇博客为:https://www.cnblogs.com/lxhbky/p/11884474.html 本文主要是为了解决上面博客遗留的一个含有不规范数据的一种方法,目前暂时没有从包里发现可以从第 ...
- python面向对象-1
1.面向对象的思想优点 优点: 简化代码 ,构建公共模板 ,扩展性强 思想: 类作为模板 ,对象通过模板实例化对象 ,对象去做事 ,抽象将显示存在的事物使用代码体现 2.三大特性 封装(狭义) : 对 ...
- 开启Hyper-V
开启Hyper-V 添加方法非常简单,把以下内容保存为.cmd文件,然后以管理员身份打开这个文件.提示重启时保存好文件重启吧,重启完成就能使用功能完整的Hyper-V了. pushd "%~ ...
- 升鲜宝V2.0_杭州生鲜配送行业,升鲜宝供应链B端订货系统使用说明_升鲜宝生鲜供应链管理系统_15382353715_余东升
升鲜宝V2.0_杭州生鲜配送行业,升鲜宝供应链B端订货系统使用说明_升鲜宝生鲜供应链管理系统_15382353715 升鲜宝生鲜配送供应链系统经过这些年的发展,形成一套独特的订 ...
- C lang: VLA(variable-length array)
Xx_VLA Introduction VLA:variable-length array,not variable array size,but variable arary dimensional ...
- 内存取证工具-volatility、foremost
内存取证 1. 内存取证工具volatility 猜测dump文件的profile值 root@kali:~/CTF# volatility -f mem.vmem imageinfo Volatil ...
- IP安全,DDoS攻击、tearDrop攻击和微小IP碎片攻击
目录 arp安全 IP报文格式 DoS攻击 tear drop攻击 微小碎片攻击 IP欺骗,留后门 arp安全 以太网帧的type =0806 表示arp arp攻击:hack伪造arp应答包给tar ...
- ftp上传文件,上传的文件大小是0
此问题是最近出现,代码和配置完全没改,试过所有的办法,两天了一直都解决不了,用完弃坑. 防火墙.被动模式主动模式,编码,服务端内存,日志,common-net.jar版本问题,服务端配置,nginx配 ...
- VMware Workstation虚拟机安装CentOS-7-Minimal经验分享
本文主要为0基础的小白准备,有一定经验的大神请忽略.因为最近刚接触linux,在其中也是遇到无数的弯路,本着互惠互利原则,特写这个博客,希望后来人能少走点弯路,更快的进入状态.话不多说,上货. 一,首 ...
- pymysql用法,Python连接MySQL数据库
Pymysql模块是专门用来操作mysql数据库的模块,使用前需要安装,安装指令:pip install pymysql 操作流程: 第一步:import pymysql 第二步:获取数据库的连接 , ...