动态规划之字符串最短编辑距离
题目描述
给定两个字符串A和B,现在要将A经过若干操作变为B,可进行的操作有:
删除–将字符串A中的某个字符删除。
插入–在字符串A的某个位置插入某个字符。
替换–将字符串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;
}
动态规划之字符串最短编辑距离相关推荐
- python距离向量路由算法_python算法练习——动态规划与字符串的编辑距离
动态规划与字符串的编辑距离 动态规划 动态规划(dynamic programming)是解决多阶段决策问题常用的最优化理论,该理论由美国数学家Bellman等人在1957年提出,用于研究多阶段决策过 ...
- 经典动态规划问题:最短编辑距离算法的原理及实现
编辑距离的定义 编辑距离(Edit Distance)最常用的定义就是Levenstein距离,是由俄国科学家Vladimir Levenshtein于1965年提出的,所以编辑距离一般又称Leven ...
- 【动态规划】字符串类型动态规划
这里总结一下字符串类型的动态规划问题,一般涉及最值问题,方案数问题都可以使用动态规划来解决 最短编辑距离 这个问题显然是一个最优解问题,对于最优解问题我们可以考虑动态规划解题,因此我们得先考虑子问题, ...
- 最短编辑距离(动态规划超详细填表法)
链接:https://www.nowcoder.com/questionTerminal/9649617be3bf42288f50758df4310655 来源:牛客网 UNIX系统下有一个行编辑器e ...
- 8.动态规划(1)——字符串的编辑距离
动态规划的算法题往往都是各大公司笔试题的常客.在不少算法类的微信公众号中,关于"动态规划"的文章屡见不鲜,都在试图用最浅显易懂的文字来描述讲解动态规划,甚至有的用漫画来解释,认真读 ...
- 算法——动态规划算法求解字符串的编辑距离
当有人让你用递归算法求解斐波那契数列以及字符串的编辑距离时,所设的陷阱都是一致的(递归调用时的重复计算),解决方案也是一致的(引入备忘录概念).观察树形的层级调用关系,我们可以发现动态规划隐式地嵌入了 ...
- 动态规划最常见的习题 (最长公共子串、最长公共子序列、最短编辑距离)
(1)理论部分: (2)习题: 最长公共子串: 1 package month7.dp; 2 3 //https://www.nowcoder.com/questionTerminal/181a1a7 ...
- 最短编辑距离 python_最短编辑距离算法实现
一,算法介绍 在CS124课程的第一周提到 求解两个字符串相似度的算法---Minimum Edit Distance(最短编辑距离)算法.该算法在NLP(自然语言处理)中也会用到. 如何定义相似度呢 ...
- 最短编辑距离问题理解
最短编辑距离是指两个字符串,把其中一个字符串转为另一个字符串所需要花费的最小操作成本. 设dp[i][j]为Xi与Yj的最短编辑距离,则Xi与Yj处于最优解时的排列有三种情况 1.Xi最后一个元素xi ...
最新文章
- python 单继承的实现
- LabelBinarizer的妙用
- 第三次学JAVA再学不好就吃翔(part83)--泛型类
- python dict遍历_Python 容器(二):字典(Dict)
- C++学习——内联函数
- (caffe入门)windows caffe 之 mnist 训练
- java.lang.UnsatisfiedLinkError: D:\Tomcat\apache-tomcat-7.0.67\bin\tcnative-1.dll:
- 如何找到字符串中的最长回文子串?
- 端如何访问rc_如何进行 Linux 启动时间优化
- 小样本学习与Triplet Loss,数据增强和课程学习
- 笔记——常用网站总结
- 钉钉微应用怎么进入_海目星激光张荣:激光焊接在锂电池生产应用中越来越多...
- 【J2EE】在项目中理解J2EE规范
- Excel中计算年龄的函数
- java文档翻译,将word文件翻译该怎么操作?
- 通过telnet命令使用SMTP、POP3协议收发邮件(以QQ邮箱为例)
- mysql两个等号是什么运算符_什么是MySQL中的这个运算符=?
- 打开 cmd 的方式
- video.js+jquery.danmu.js实现视频播放+发送弹幕
- 谷歌浏览器支持的音频和视频文件编码格式