首页 星云 工具 资源 星选 资讯 热门工具
:

PDF转图片 完全免费 小红书视频下载 无水印 抖音视频下载 无水印 数字星空

线性dp:编辑距离

编程知识
2024年08月23日 19:24

编辑距离

  • 本题与力扣72.编辑距离题意一样,阅读完本文可以尝试leetcode72.
    力扣题目链接

题目叙述

输入两个字符串a,b。输出从字符串a修改到字符串b时的编辑距离

输入

NOTV
LOVER

输出

4

题目解释:

img

动态规划思路

  • 这个问题显然是一个最优解问题,我们可以考虑动态规划的思路,那么我们使用动态规划的思路,要想得到最优解问题,那么我们必须要先考虑子问题。
  • 子问题:我们先考虑a[1,2...i]b[1,2....j]的编辑距离

状态变量的含义

  • 设立一个dp数组,作为我们的状态变量
    • dp[i][j]表示以从a[1...i]b[1....j]的编辑距离

递推公式

  • 设立完状态变量,那么我们就进入了递推公式的推导
    • 1.若a[i]=b[j],那么dp[i][j]==dp[i-1][j-1]
    • 2.a[i]!=b[j]

img

  • 那么我们就很容易的推出我们的递推公式:
    • dp[i][j]=dp[i-1][j-1]a[i]==b[j]
    • dp[i][j]=min(dp[i-1][j-1],dp[i][j-1],dp[i-1][j])+1)(a[i]!=b[j]

遍历顺序

  • 显然是从上到下,从左到右。

初始化dp数组

  • 边界条件:

    • f[i][0]=i
    • f[0][j]=j
  • 对应的初始化代码如下:

m=strlen(a);
n=strlen(b);
for(int i=1;i<=m;j++) dp[i][0]=i;
for(int j=1;j<=n;j++) dp[0][j]=j;
for(int i=1;i<=m;i++){
    for(int j=1;j<=n;j++){
        if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1];
        else dp[i][j]=min(dp[i-1][j-1],min(dp[i][j-1],dp[i-1][j])+1;
    }
}
cout<<f[m][n];

举例打印dp数组

  • 举例如下:

img

代码

  • 最终实现代码如下:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;

char a[2005],b[2005];
int f[2005][2005];

int main(){
  scanf("%s %s",a,b);
  int la=strlen(a), lb=strlen(b);
  for(int i=1;i<=la;i++) f[i][0]=i;
  for(int i=1;i<=lb;i++) f[0][i]=i
      
  for(int i=1;i<=la;i++)
    for(int j=1;j<=lb;j++)
      if(a[i-1]==b[j-1])f[i][j]=f[i-1][j-1];
      else f[i][j]=min(min(f[i-1][j],f[i][j-1]),f[i-1][j-1])+1;

  printf("%d\n",f[la][lb]);
}
From:https://www.cnblogs.com/Tomorrowland/p/18369792
本文地址: http://shuzixingkong.net/article/1385
0评论
提交 加载更多评论
其他文章 一文讲清楚static关键字
static能修饰的地方 静态变量 静态变量: 又称为类变量,也就是说这个变量属于类的,类所有的实例都共享静态变量,可以直接通过类名来访问它;静态变量在内存中只存在一份。 实例变量: 每创建一个实例就会产生一个实例变量,它与该实例同生共死。 静态方法 静态方法在类加载的时候就存在了,它不依赖于任何实
平衡搜索树-AVL树 图文详解 (万字长文)
目录AVL树AVL树的概念AVL树节点的定义:AVL树的插入基本情况分析平衡因子对应的操作旋转操作分析需要旋转的情况结论4种旋转操方法与特征6种双旋平衡因子特征代码实现四种旋转实现插入操作实现树高度与是否平衡树判断实现其他实现插入验证BenchMark环境测试工具和方法测试结果: AVL树 AVL树
平衡搜索树-AVL树  图文详解  (万字长文) 平衡搜索树-AVL树  图文详解  (万字长文) 平衡搜索树-AVL树  图文详解  (万字长文)
Go 互斥锁 Mutex 源码分析 (一)
原创文章,欢迎转载,转载请注明出处,谢谢。 0. 前言 锁作为并发编程中的关键一环,是应该要深入掌握的。 1. 锁 1.1 示例 实现锁很简单,示例如下: var global int func main() { var mu sync.Mutex var wg sync.WaitGroup for
Go 互斥锁 Mutex 源码分析 (一) Go 互斥锁 Mutex 源码分析 (一)
WPF 模仿前端大佬写一个Hover效果
先看一下效果吧: 原博主的地址:【动画进阶】神奇的卡片 Hover 效果与 Blur 的特性探究 - ChokCoco - 博客园 (cnblogs.com) 原效果是一个css效果,我们采用WPF的方式模仿一下 因为技术有限,没有原博主的那么好看,毕竟盗版永远比不过原版... 然后这里看一下盗版的
WPF 模仿前端大佬写一个Hover效果 WPF 模仿前端大佬写一个Hover效果 WPF 模仿前端大佬写一个Hover效果
关于对 Tomcat 进行小版本升级的快速解决方案
1、背景描述 原来的 Tomcat 在部署时,使用的是最新的版本 9.0.40 。 经过一段时间后,在原来的 Tomcat 版本中,发现存在漏洞。 因此,需要将旧版本(9.0.40)升级到没有漏洞的新版本(9.0.93)。 2、查看Tomcat的版本信息 如上图所示,在 tomcat 的 bin 目
关于对 Tomcat 进行小版本升级的快速解决方案 关于对 Tomcat 进行小版本升级的快速解决方案 关于对 Tomcat 进行小版本升级的快速解决方案
Python的OpenCV转换图像大小
本文简要介绍了Python的OpenCV转换图像大小的方法,本文加载一个图像文件,将其大小转换为指定的宽度和高度,然后显示并保存转换后的图像。
全网最适合入门的面向对象编程教程:37 Python常用复合数据类型-列表和列表推导式
在Python中,列表是一个非常灵活且常用的复合数据类型。它允许存储多个项,这些项可以是任意的数据类型,包括其他列表。列表推导式是一种简洁的方式来创建和操作列表。
全网最适合入门的面向对象编程教程:37 Python常用复合数据类型-列表和列表推导式 全网最适合入门的面向对象编程教程:37 Python常用复合数据类型-列表和列表推导式 全网最适合入门的面向对象编程教程:37 Python常用复合数据类型-列表和列表推导式
推荐7款美观且功能强大的WPF UI库
前言 经常看到有小伙伴在DotNetGuide技术社区交流群里提问:WPF有什么好用或者好看的UI组件库推荐的?,今天大姚给大家分享7款开源、美观、功能强大、简单易用的WPF UI组件库。 WPF介绍 WPF 是一个强大的桌面应用程序框架,用于构建具有丰富用户界面的 Windows 应用。它提供了灵
推荐7款美观且功能强大的WPF UI库 推荐7款美观且功能强大的WPF UI库 推荐7款美观且功能强大的WPF UI库