动态规划——编辑距离
编辑距离不仅是动态规划里很经典的例题,也是面试中高频出现的题目,需要我们好好掌握。
学完本文,你可以尝试实现
洛谷P2758 编辑距离
Leetcode 72.编辑距离
题目介绍
洛谷例题
题目描述
设A和B是两个字符串。我们要用最少的字符操作次数,将字符串A转换为字符串B。这里所说的字符操作共有三种:
1、删除一个字符;
2、插入一个字符;
3、将一个字符改为另一个字符;
!皆为小写字母!
输入格式
第一行为字符串A;第二行为字符串B;字符串A和B的长度均小于2000。
输出格式
只有一个正整数,为最少字符操作次数。
输入输出样例
输入 1
sfdqxbw gfdgw输出 1
4Leetcode例题
编辑距离详解过程
前言
如果你刚刚听说动态规划,还不太明白
dp
为啥要定义成这样,转移方程是啥。
欢迎来看一下这篇题解,看完能稍微理解一下动态规划到底做了什么事?
或许芭。思路
1.动态规划
2.定义 dp[i][j]
21. dp[i][j] 代表 word1 中前 i 个字符,变换到 word2 中前 j 个字符,最短需要操作的次数
22. 需要考虑 word1 或 word2 一个字母都没有,即全增加/删除的情况,所以预留 dp[0][j] 和 dp[i][0]3.状态转移
31. 增,dp[i][j] = dp[i][j - 1] + 1
32. 删,dp[i][j] = dp[i - 1][j] + 1
33. 改,dp[i][j] = dp[i - 1][j - 1] + 1
34. 按顺序计算,当计算 dp[i][j] 时,dp[i - 1][j] , dp[i][j - 1] , dp[i - 1][j - 1] 均已经确定了
35. 配合增删改这三种操作,需要对应的 dp 把操作次数加一,取三种的最小
36. 如果刚好这两个字母相同 word1[i - 1] = word2[j - 1] ,那么可以直接参考 dp[i - 1][j - 1] ,操作不用加一图解
绿色:增
红色:删
黄色:改大功告成!
解题代码 洛谷
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
//楼上为一些头文件
using namespace std ;const int kMaxLen = 2000 + 5 ;//字符串长度最大为2000,定义数组的时候就加个5int len1 , len2 , dp[kMaxLen][kMaxLen] ;
//len1表示字符串A的长度
//len2表示字符串B的长度
string s1 , s2 ;
//s1:A字符串
//s2:B字符串
int main(){cin >> s1 >> s2 ;//输入字符串len1 = s1.size() ;len2 = s2.size() ;//用size()函数取长度for(int i = 1 ; i <= len1 ; i++ ){dp[i][0] = i ;}for(int i = 1 ; i <= len2 ; i++ ){dp[0][i] = i ;}//dp部分代码:for(int i = 1 ; i <= len1 ; i++ ){//枚举A字符串的字符for(int j = 1 ; j <= len2 ; j++ ){//枚举B字符串的字符if(s1[i - 1] == s2[j - 1])//字符串是从零开始的所以要减一dp[i][j] = dp[i - 1][j - 1] ;//不变}else{dp[i][j] = min(min(dp[i][j - 1] + 1 , dp[i - 1][j] + 1) , dp[i - 1][j - 1] + 1) ;//删除,添加,替换}}}cout << dp[len1][len2] ; //输出结果return 0 ;结束了}
解题代码 Leetcode
class Solution {
public:int minDistance(string word1, string word2) {int len1 = word1.length();int len2 = word2.length();vector<vector<int> > dp(len1+1,vector<int>(len2+1,0));for(int i = 0;i<=len1;i++) dp[i][0] = i;for(int j = 0;j<=len2;j++) dp[0][j] = j;for(int i = 1;i<=len1;i++){for(int j = 1;j<=len2;j++){if(word1[i-1] == word2[j-1])dp[i][j] = dp[i-1][j-1];else{dp[i][j] = min({dp[i-1][j],dp[i][j-1],dp[i-1][j-1]})+1;}}}return dp[len1][len2];}
};
动态规划——编辑距离相关推荐
- 动态规划编辑距离_使用动态规划方法解决编辑距离问题
动态规划编辑距离 使用动态编程(DP)解决问题时出现的第一个问题是如何弄清楚DP是解决问题的一种方法? 因此,我将使用动态编程解决问题,并说明如何解决这一问题. "明确说明的问题是一半解决的 ...
- 动态规划--编辑距离问题
文章目录 1 编辑距离问题 1 编辑距离问题 定义: 给定字符串A和字符串B,我们可以进行替换.插入.删除三种操作,使得字符串A和字符串B相等的最小操作次数,称为从字符串A到字符串B的最小编辑距离. ...
- 算法之动态规划——编辑距离问题
编辑距离问题 时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte 总提交:60 测试通过:19 描述 设A和B是2个字符串.要用最少的字符操作将字符串A转换为字 ...
- labuladong的算法小抄pdf_真漂亮!这份GitHub上爆火的算法面试笔记,助你圆满大厂梦...
前言 Github作为程序员们的后花园,一直以来都是程序员最喜欢逛逛.学习的地方,小编也不例外,最近看到一份对标BAT等一线大厂的算法面试笔记,已经标星68+K了,很是惊讶,看了一下,觉得知识点整理得 ...
- 算法工程师思维导图—数据结构与算法
卖萌屋的妹子们(划掉)作者团整理的算法工程师思维导图,求职/自我提升/查漏补缺神器.该手册一共分为数据结构与算法.数学基础.统计机器学习和深度学习四个部分. 点击这里查看具体使用指南.该手册有两种获取 ...
- 找到所有数组中消失的数字_【一点资讯】千万程序员的呼声:面试如何拿到大厂Offer?这份阅读量超过11W+的算法刷题宝典请你原地查收 www.yidianzixun.com...
如何才能通过面试拿到大厂Offer? "刷leetcode!" 这是我听到最多的回答! 现在越来越多的人应聘工作时都得先刷个几十百来道题,不刷题感觉都过不了面试. 无论是面测试.算 ...
- 搬砖试金石!github星标7W算法刷题宝典,还愁拿不下大厂offer?
前言 这几年IT技术蓬勃发展,日新月异,对技术人才的需求日益增长,程序员招聘市场也如火如荼.在有限的三五轮面试中,国外流行让面试者编程解决某些数据结构和算法的题目,通过观察面试者编码的熟练程度.思考的 ...
- Github惊现高星神作,两份算法宝典让你横扫大厂算法面试题
前言 有些小伙伴可能会有疑惑,为什么面试总喜欢问算法与数据结构问题,这是有原因的 首先,算法能看出一个程序员的 基本功 ,数据结构与算法是计算机领域里面最最基础的学科,其他更高级的领域都或多或少都涉及 ...
- 腾讯T3整理分享的LeetCode算法小抄完整文档
前言 本文⽬前可以⼿把⼿带你解决 110 道 LeetCode 算法问题,⽽且在不断更新,全部基于 LeetCode 的题⽬,涵盖了所有题型和技巧. 目录 主要内容 ⽬前已包含的 114 道题⽬教程如 ...
最新文章
- 白洋组公众号-植物微生组33天受邀原创-诚邀同行分享经验
- mysql保留2位小数字段如何设置 浮点数
- WordPress备份的七种办法
- 【CV】通俗易懂的目标检测 | RCNN, SPPNet, Fast, Faster
- 对某公司一次***测试
- UVA 11732 - strcmp() Anyone?(Trie)
- linux 创建文件夹快捷方式
- Git 管理工具 SourceTree 的使用(上手简单,不熟悉git命令的开发者必用)
- 助力自动驾驶商业化 高德公布高精地图技术路线图
- 推荐系统之NFM原理与实现学习
- 在制作蓝牙小车app中遇到的坑
- Gboard导入简体中文词库,详细操作教程。
- A4纸尺寸大小是多少
- 游戏开发-国外的10 个最佳的独立游戏开发社区网站
- 计算机如何修改用户名和密码忘了怎么办,电脑用户名密码忘记怎么办
- 见闻-关于codec芯片
- RRPP相切环配置示例
- Scratch软件编程等级考试一级——201909
- 刷脸支付助力互联网产业时代全面到来
- 怎么申请沙特SABER认证及流程如何