题目描述

给定两个字符串A和B,现在要将A经过若干操作变为B,可进行的操作有:

  1. 删除–将字符串A中的某个字符删除。

  2. 插入–在字符串A的某个位置插入某个字符。

  3. 替换–将字符串A中的某个字符替换为另一个字符。

现在请你求出,将A变为B至少需要进行多少次操作。

输入格式

第一行包含整数n,表示字符串A的长度。

第二行包含一个长度为n的字符串A。

第三行包含整数m,表示字符串B的长度。

第四行包含一个长度为m的字符串B。

字符串中均只包含小写字母。

输出格式

输出一个整数,表示最少操作次数。

数据范围

1≤n,m≤1000

输入样例:

10
AGTCTGACGC
11
AGTAAGTAGGC

输出样例:

4

题解:

将一个字符串通过删除、插入、替换变为另一个字符串的最短距离,可以用动态规划来做,用f(i, j)来表示长度为i的字符串变为长度为j的字符串最小的操作次数,那么如何来求f(i, j)呢?对每个字符我们有3种操作:

1.删除:假设删除a[i]后,a[1 ~ i] 与 b[1 ~ j] 匹配,那么说明a[1 ~ i - 1]已经与b[1 ~ j]相等了,那么多出来的a[i]直接删掉即可,状态转移方程为:f(i, j) = f(i - 1, j) + 1

2.插入: 假设插入一个a[i],使a[i] == b[j]后,a[1 ~ i] 与 b[1 ~ j] 匹配,那么说明a[1 ~ i]已经与b[i ~ j - 1]相等了,要使a[1 ~ i]与b[i ~ j]相等,只需再a[1 ~ i]的后面添加一个b[j]即可

状态转移方程为:f(i, j) = f(i, j - 1) + 1

3.替换:假设将a[i]替换成b[j],使得a[1 ~ i] 与 b[1 ~ j] 匹配,那么说明a[1 ~ i - 1]已经与b[i ~ j - 1]相等了,要使a[1 ~ i]与b[i ~ j]相等,只需将a[i]替换为b[j]即可。

如果a[i] = b[j],则无需替换,状态转移方程为:f(i, j) = f(i - 1, j - 1)

如果a[i] != b[j],则需要替换,状态转移方程为:f(i, j) = f(i - 1, j - 1) + 1

所以我们得出来总的状态转移方程式为就是上述方程式的最小值

代码如下:

#include<iostream>
using namespace std;
const int N = 1010;
char s1[N], s2[N];
int f[N][N];
int main()
{int n, m;cin >> n >> s1 + 1;cin >> m >> s2 + 1;for(int i = 0; i <= n; i++)  //a[i ~ i]变为0,只能删除, 操作数为if[i][0] = i;for(int i = 0; i <= m; i++)//a[0]变为b[1 ~ i],只能添加,操作数为if[0][i] = i;for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){//f[i - 1][j] + 1 表示进行删除操作//f[i][j - 1] + 1 表示进行添加操作f[i][j] = min(f[i - 1][j] + 1, f[i][j - 1] + 1);//下面的表示进行替换操作if(s1[i] == s2[j])f[i][j] = min(f[i][j], f[i - 1][j - 1]);else f[i][j] = min(f[i][j], f[i - 1][j - 1] + 1);}}cout << f[n][m] << endl;return 0;
}

动态规划之字符串最短编辑距离相关推荐

  1. python距离向量路由算法_python算法练习——动态规划与字符串的编辑距离

    动态规划与字符串的编辑距离 动态规划 动态规划(dynamic programming)是解决多阶段决策问题常用的最优化理论,该理论由美国数学家Bellman等人在1957年提出,用于研究多阶段决策过 ...

  2. 经典动态规划问题:最短编辑距离算法的原理及实现

    编辑距离的定义 编辑距离(Edit Distance)最常用的定义就是Levenstein距离,是由俄国科学家Vladimir Levenshtein于1965年提出的,所以编辑距离一般又称Leven ...

  3. 【动态规划】字符串类型动态规划

    这里总结一下字符串类型的动态规划问题,一般涉及最值问题,方案数问题都可以使用动态规划来解决 最短编辑距离 这个问题显然是一个最优解问题,对于最优解问题我们可以考虑动态规划解题,因此我们得先考虑子问题, ...

  4. 最短编辑距离(动态规划超详细填表法)

    链接:https://www.nowcoder.com/questionTerminal/9649617be3bf42288f50758df4310655 来源:牛客网 UNIX系统下有一个行编辑器e ...

  5. 8.动态规划(1)——字符串的编辑距离

    动态规划的算法题往往都是各大公司笔试题的常客.在不少算法类的微信公众号中,关于"动态规划"的文章屡见不鲜,都在试图用最浅显易懂的文字来描述讲解动态规划,甚至有的用漫画来解释,认真读 ...

  6. 算法——动态规划算法求解字符串的编辑距离

    当有人让你用递归算法求解斐波那契数列以及字符串的编辑距离时,所设的陷阱都是一致的(递归调用时的重复计算),解决方案也是一致的(引入备忘录概念).观察树形的层级调用关系,我们可以发现动态规划隐式地嵌入了 ...

  7. 动态规划最常见的习题 (最长公共子串、最长公共子序列、最短编辑距离)

    (1)理论部分: (2)习题: 最长公共子串: 1 package month7.dp; 2 3 //https://www.nowcoder.com/questionTerminal/181a1a7 ...

  8. 最短编辑距离 python_最短编辑距离算法实现

    一,算法介绍 在CS124课程的第一周提到 求解两个字符串相似度的算法---Minimum Edit Distance(最短编辑距离)算法.该算法在NLP(自然语言处理)中也会用到. 如何定义相似度呢 ...

  9. 最短编辑距离问题理解

    最短编辑距离是指两个字符串,把其中一个字符串转为另一个字符串所需要花费的最小操作成本. 设dp[i][j]为Xi与Yj的最短编辑距离,则Xi与Yj处于最优解时的排列有三种情况 1.Xi最后一个元素xi ...

最新文章

  1. python 单继承的实现
  2. LabelBinarizer的妙用
  3. 第三次学JAVA再学不好就吃翔(part83)--泛型类
  4. python dict遍历_Python 容器(二):字典(Dict)
  5. C++学习——内联函数
  6. (caffe入门)windows caffe 之 mnist 训练
  7. java.lang.UnsatisfiedLinkError: D:\Tomcat\apache-tomcat-7.0.67\bin\tcnative-1.dll:
  8. 如何找到字符串中的最长回文子串?
  9. 端如何访问rc_如何进行 Linux 启动时间优化
  10. 小样本学习与Triplet Loss,数据增强和课程学习
  11. 笔记——常用网站总结
  12. 钉钉微应用怎么进入_海目星激光张荣:激光焊接在锂电池生产应用中越来越多...
  13. 【J2EE】在项目中理解J2EE规范
  14. Excel中计算年龄的函数
  15. java文档翻译,将word文件翻译该怎么操作?
  16. 通过telnet命令使用SMTP、POP3协议收发邮件(以QQ邮箱为例)
  17. mysql两个等号是什么运算符_什么是MySQL中的这个运算符=?
  18. 打开 cmd 的方式
  19. video.js+jquery.danmu.js实现视频播放+发送弹幕
  20. 谷歌浏览器支持的音频和视频文件编码格式

热门文章

  1. TAOCP-1.2.10_求极大值
  2. 组内分享slide 【about 3D】
  3. clean build 的区别(转)
  4. 游戏外挂设计技术探讨(上)
  5. php工场模式讲解,PHP设计模式之工厂模式详解
  6. 夯实Java基础(二十一)——Java反射机制
  7. 24 反转链表(第3章 高质量的代码-代码的鲁棒性)
  8. linux bash基本特性
  9. DP || HYSBZ 1207 打鼹鼠
  10. 让ffmpeg支持10bit编码