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等 ...
随机推荐
- 精通awk系列(6):awk命令结构和awk语法结构
回到: Linux系列文章 Shell系列文章 Awk系列文章 awk命令行结构和语法结构 awk命令行结构 awk [ -- ] program-text file ... (1) awk -f p ...
- js-08-数组学习
一.数组语法格式 var name=[item1,item2,......] 二.数组的声明创建 var arr=new Aarray( ) //声明一个空数组对象 var arr=new Array ...
- java读取文本文件内容2
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/183 很久之前写了一篇Java读取文本文件内容,链接地址是 ...
- MySQL删除大表时潜在的问题(drop table,truncate table)
来源于:https://www.cnblogs.com/CtripDBA/p/11465315.html,侵删,纯截图,避免吸引流量之嫌 case1,删除大表时,因为清理自适应hash索引占用的内容导 ...
- mysql从5.6升级到5.7后出现 Expression #1 of ORDER BY clause is not in SELECT list,this is incompatible with DISTINCT
[问题]mysql从5.6升级到5.7后出现:插入数据和修改数据时出错Caused by: com.ibatis.common.jdbc.exception.NestedSQLException: - ...
- 并发编程~~~协程~~~greenlet模块, gevent模块
一 协程 1. 协程: 单线程下的并发,又称微线程,纤程.协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 并发真正的核心: 切换并且保持状态. 开启协程并发的执行,自己的程序把控着C ...
- linux 磁盘分区和挂载看这一篇就够了
Linux fdisk 和 mount 命令操作指南,linux磁盘管理.新增磁盘.挂载新硬盘(linux运维入门) 首先列出文件系统的整体磁盘空间使用情况.可以用来查看磁盘已被使用多少空间和还剩余多 ...
- jenkins实现git自动拉取代码时替换配置文件
jenkins实现从git上自动拉取源代码——>自动编译——>发布到测试服务器——>验证测试,这个大家应该都知道,但是关于源代码里的配置文件,可能就会有点头疼了, 一般测试都会自己的 ...
- Goland安装
Goland安装 http://c.biancheng.net/view/6124.html
- java之子类对象实例化过程
假设现在有这么一个父类: public class Person{ public Person(){} public String name = "tom"; public int ...