【动态规划】(一)编辑距离
动态规划算法之编辑距离
一、什么是编辑距离
编辑距离(Edit distance,简称EDS),就是求字符串s1到字符串s2的最少修改次数。每次修改的方式如下:
1.增加一个字符。如:abcabcabc -> abcdabcdabcd
2.删除一个字符。如:abcabcabc -> ababab
3.修改一个字符。如:abcabcabc -> abdabdabd
二、编辑距离怎么求
1.深搜枚举
深搜枚举的时间复杂度很高。假设字符串只有小写字母,最长的字符串长度为nnn,则时间复杂度为O(26n)O(26^n)O(26n),远远超出题目范围。
2.动态规划(重点)
举个例子
以hashashas与havehavehave为例,要求hashashas与havehavehave的编辑距离,就可以把它转化成hashashas与havhavhav的编辑距离。那么我们就可以创建一个dpdpdp数组,其中,dp[i][j]dp[i][j]dp[i][j]表示从a串的第一个字符到第i个字符与b串第一个字符到第j个字符的编辑距离。如下图所示:
^ | h | a | v | e | |
---|---|---|---|---|---|
^ | 0 | ||||
h | |||||
a | |||||
s |
第一步,dp[0][0]dp[0][0]dp[0][0]将更新为0。毕竟空串空串空串与空串空串空串与的编辑距离也是0嘛。
^ | h | a | v | e | |
---|---|---|---|---|---|
^ | 0 | 1 | 2 | 3 | 4 |
h | 1 | ||||
a | 2 | ||||
s | 3 |
第二步,更新dp[0][j]dp[0][j]dp[0][j]与dp[i][0]dp[i][0]dp[i][0],其中,dp[i][0]=idp[i][0] = idp[i][0]=i,dp[0][j]=jdp[0][j] = jdp[0][j]=j。
^ | h | a | v | e | |
---|---|---|---|---|---|
^ | 0 | 1 | 2 | 3 | 4 |
h | 1 | 0 | |||
a | 2 | ||||
s | 3 |
第三步,就要正式模拟了。先看hhh和hhh,由于他们相等,那就是dp[i−1][j−1]dp[i - 1][j - 1]dp[i−1][j−1]了,因为这两个字符相等,不用做任何改变。
^ | h | a | v | e | |
---|---|---|---|---|---|
^ | 0 | 1 | 2 | 3 | 4 |
h | 1 | 0 | 1 | ||
a | 2 | ||||
s | 3 |
第四步,再看hhh和aaa,他们不相同,就要从dp[i−1][j]dp[i - 1][j]dp[i−1][j]、dp[i−1][j−1]dp[i - 1][j - 1]dp[i−1][j−1]、dp[i][j−1]dp[i][j - 1]dp[i][j−1]里面选一个最小值,加上1。加上一的原因是要对某个字符进行改变。
^ | h | a | v | e | |
---|---|---|---|---|---|
^ | 0 | 1 | 2 | 3 | 4 |
h | 1 | 0 | 1 | 2 | 3 |
a | 2 | 1 | 0 | 1 | 2 |
s | 3 | 2 | 1 | 2 | 2 |
第五步,以此类推。最后,dp[alen][blen]dp[alen][blen]dp[alen][blen]就是答案。
关键来了!
得出的转移方程:
1.dp[i][j]=dp[i−1][j−1],a[i]=b[j]dp[i][j]=dp[i - 1][j - 1],a[i] = b[j]dp[i][j]=dp[i−1][j−1],a[i]=b[j]
2.dp[i][j]=min(dp[i−1][j−1],dp[i−1][j],dp[i][j−1])+1,a[i]!=b[j]dp[i][j]=min(dp[i - 1][j - 1],dp[i - 1][j],dp[i][j - 1])+1,a[i]!=b[j]dp[i][j]=min(dp[i−1][j−1],dp[i−1][j],dp[i][j−1])+1,a[i]!=b[j]
边界值为:
dp[i][0]=i,dp[0][j]=jdp[i][0]=i,dp[0][j]=jdp[i][0]=i,dp[0][j]=j
上代码!
#include<iostream>
#include<cstring>
using namespace std;
int dp[105][105];
int min(int a, int b, int c){if(a < b){if(a < c)return a;return c;}if(b < c)return b;return c;
}
int main(){string s1, s2;cin >> s1 >> s2;int lena, lenb;lena = s1.length();//可用s1.size()代替,注意导入cstring库lenb = s2.length();if(s1[0] == s2[0]){dp[0][0] = 0;} else {dp[0][0] = 1;}for(int i = 0; i < lenb; i++){dp[0][i] = i;}for(int i = 0; i < lena; i++){dp[i][0] = i;}for(int i = 1; i < lena; i++){for(int j = 1; j < lena; j++){if(s1[i] == s2[j]){dp[i][j] = dp[i - 1][j - 1];} else {dp[i][j] = min(dp[i - 1][j], dp[i - 1][j - 1], dp[i][j - 1]) + 1;}}}cout << dp[lena][lenb];return 0;
}
【动态规划】(一)编辑距离相关推荐
- 动态规划求编辑距离 - 残阳似血的博客
动态规划求编辑距离 - 残阳似血的博客 动态规划求编辑距离 - 残阳似血的博客 动态规划求编辑距离 位于分类 自然语言处理 这两天在写一个简单的单词拼写检查器(Spell checker),本来求编辑 ...
- 动态规划解决编辑距离问题
动态规划解决编辑距离问题 问题描述: 编辑距离:是指两个字串之间,由一个转成另一个所需的最少编辑操作次数. 方法:动态规划 状态:F(i,j):word1的前i个字符与word2的前j个字符的编辑距离 ...
- 由动态规划计算编辑距离引发的思考
简单介绍 编辑距离算法: https://www.cnblogs.com/BlackStorm/p/5400809.html https://wizardforcel.gitbooks.io/the- ...
- 经典动态规划:编辑距离
点击关注上方"五分钟学算法", 设为"置顶或星标",第一时间送达干货. 转自面向大象编程 本期例题:LeetCode 72. Edit Distance 编辑距 ...
- 动态规划---最短编辑距离
描述: 设A和B是2个字符串.要用最少的字符操作将字符串A转换为字符串B.这里所说的字符操作包括: (1)删除一个字符; (2)插入一个字符: (3)将一个字符改为另一个字符. 将字符串A变换为字符串 ...
- 动态规划____编辑距离
#include <stdio.h> #include <string.h>#define INF -1 #define MAX 1010int map[MAX][MAX]; ...
- 55天 - 算法 - 动态规划 - 数组类 从前往后
//模板#include <iostream> #include <cstdio> #include <string> using namespace std;/* ...
- 经典动态规划:戳气球问题
点击上方蓝字设为星标 东哥带你手把手撕力扣~ 作者:labuladong 公众号:labuladong 若已授权白名单也必须保留以上来源信息 今天我们要聊的这道题「Burst Balloon」和之 ...
- java动态规划鸡蛋问题_动态规划系列/高楼扔鸡蛋问题.md · lipengfei/fucking-algorithm - Gitee.com...
# 经典动态规划问题:高楼扔鸡蛋 今天要聊一个很经典的算法问题,若干层楼,若干个鸡蛋,让你算出最少的尝试次数,找到鸡蛋恰好摔不碎的那层楼.国内大厂以及谷歌脸书面试都经常考察这道题,只不过他们觉得扔鸡蛋 ...
- 编辑距离(Edit Distance)
编辑距离是用于比较两个字符串或者符号序列之间距离的常用距离函数. 含义为:给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数,可以对一个单词进行如下 ...
最新文章
- Nginx缓存设置教程
- 拆解一个舵机组成的机器人
- hdu4975 行列和构造矩阵(dp判断唯一性)
- Maven快速导出maven工程的依赖包
- react本地储存_如何使用React和本地存储构建freeCodeCamp的配方框
- c语言一个数组后添加元素append,jQuery 追加元素、拼接元素的方法总结(append、html、insertBefore、before等)...
- 微软发布了Visual Stduio 2010 RTM版本的虚拟机vhd文件,包含样例和动手实验(免费)...
- element-ui 分页索引问题
- 哦?你会视频剪辑?是的。好,录用你!
- Linux上修改open files数目
- 在thinkphp中引入自定义的敏感词库
- Unity插件 - MeshEditor(一) 3D线段作画 模型网格编辑器
- python画图库哪个好_python常见的十种可视化图库方法展示
- Linux部署rsyslog日志服务器(主机部分)
- 在计算机里看不到硬盘的信息,检测不到硬盘,详细教您系统里找不到硬盘该怎么办...
- Spring Boot 教程
- 《穿普拉达的女王》-观后感
- AD软件—(如何从原理图生成PCB)
- 实验二 XML之数学公式和化学分子式
- Javascript学习笔记:call()函数的使用