当前位置: 首页 > news >正文

代码随想录算法训练营Day56 | 动态规划(16/17) LeetCode 583. 两个字符串的删除操作 72. 编辑距离

动态规划马上来到尾声了,当时还觉得动态规划内容很多,但是也这么过来了。

第一题

583. Delete Operation for Two Strings

Given two strings word1 and word2, return the minimum number of steps required to make word1 and word2 the same.

In one step, you can delete exactly one character in either string.

本题和LC 115 相比,其实就是两个字符串都可以删除了,情况虽说复杂一些,但整体思路是不变的

class Solution:def minDistance(self, word1: str, word2: str) -> int:dp = [[0] * (len(word2)+1) for _ in range(len(word1)+1)]for i in range(len(word1)+1):dp[i][0] = ifor j in range(len(word2)+1):dp[0][j] = jfor i in range(1, len(word1)+1):for j in range(1, len(word2)+1):if word1[i-1] == word2[j-1]:dp[i][j] = dp[i-1][j-1]else:dp[i][j] = min(dp[i-1][j-1] + 2, dp[i-1][j] + 1, dp[i][j-1] + 1)return dp[-1][-1]

第二题

72. Edit Distance

Given two strings word1 and word2, return the minimum number of operations required to convert word1 to word2.

You have the following three operations permitted on a word:

  • Insert a character
  • Delete a character
  • Replace a character

编辑距离是用动规来解决的经典题目,这道题目看上去好像很复杂,但用动规可以很巧妙的算出最少编辑距离。利用动态规划五部曲来做一个分析:

1. 确定dp数组(dp table)以及下标的含义

dp[i][j] 表示以下标i-1为结尾的字符串word1,和以下标j-1为结尾的字符串word2,最近编辑距离为dp[i][j]。

2. 确定递推公式

整体来讲,有如下几种操作:

if (word1[i - 1] == word2[j - 1])不操作
if (word1[i - 1] != word2[j - 1])增删换
  1. if (word1[i - 1] == word2[j - 1]) 那么说明不用任何编辑,dp[i][j] 就应该是 dp[i - 1][j - 1],即dp[i][j] = dp[i - 1][j - 1];
  2. if (word1[i - 1] != word2[j - 1]),此时就需要编辑了,如何编辑呢?

    1. 操作一:word1删除一个元素,那么就是以下标i - 2为结尾的word1 与 j-1为结尾的word2的最近编辑距离 再加上一个操作。即 dp[i][j] = dp[i - 1][j] + 1;
    2. 操作二:word2删除一个元素,那么就是以下标i - 1为结尾的word1 与 j-2为结尾的word2的最近编辑距离 再加上一个操作。即 dp[i][j] = dp[i][j - 1] + 1;
    3. 操作三:替换元素,word1替换word1[i - 1],使其与word2[j - 1]相同,此时不用增删加元素。

3. dp数组如何初始化

dp[i][j] 表示以下标i-1为结尾的字符串word1,和以下标j-1为结尾的字符串word2,最近编辑距离为dp[i][j]

那么dp[i][0] 和 dp[0][j] 表示什么呢?

dp[i][0] :以下标i-1为结尾的字符串word1,和空字符串word2,最近编辑距离为dp[i][0]。

那么dp[i][0]就应该是i,对word1里的元素全部做删除操作,即:dp[i][0] = i;

同理dp[0][j] = j;

4. 确定遍历顺序

从如下四个递推公式:

  • dp[i][j] = dp[i - 1][j - 1]
  • dp[i][j] = dp[i - 1][j - 1] + 1
  • dp[i][j] = dp[i][j - 1] + 1
  • dp[i][j] = dp[i - 1][j] + 1

可以看出dp[i][j]是依赖左方,上方和左上方元素的。

5. 举例推导dp数组

class Solution:def minDistance(self, word1: str, word2: str) -> int:dp = [[0] * (len(word2)+1) for _ in range(len(word1)+1)]for i in range(len(word1)+1):dp[i][0] = ifor j in range(len(word2)+1):dp[0][j] = jfor i in range(1, len(word1)+1):for j in range(1, len(word2)+1):if word1[i-1] == word2[j-1]:dp[i][j] = dp[i-1][j-1]else:dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1return dp[-1][-1]

http://www.lryc.cn/news/172574.html

相关文章:

  • HTML+CSS+JavaScript 大学生网页设计制作作业实例代码 200套静态响应式前端网页模板(全网最全,建议收藏)
  • CFimagehost私人图床本地部署结合cpolar内网穿透实现公网访问
  • uniapp瀑布流布局写法
  • 蓝桥杯 题库 简单 每日十题 day8
  • Keepalived 高可用(附带配置实例,联动Nginx和LVS)
  • 第二证券:今年来港股回购金额超700亿港元 9月近200家公司获增持
  • Autosar基础——RTE简介
  • 几个国内可用的强大的GPT工具
  • 《Python等级考试(1~6级)历届真题解析》专栏总目录
  • 在IntelliJ IDEA 中安装阿里P3C以及使用指南
  • Java集成支付宝沙箱支付,详细教程(SpringBoot完整版)
  • 详解Nacos和Eureka的区别
  • 在Vue中实现组件间的通信(父子通信,非父子通信,通用通信)
  • LLaMA参数微调方法
  • NSSCTF之Misc篇刷题记录(17)
  • 红与黑(bfs + dfs 解法)(算法图论基础入门)
  • 为何学linux及用处
  • ChatGPT高级数据分析功能
  • 共享WiFi贴项目怎么实施与运营,微火为你提供高效解答!
  • 计算机组成原理——基础入门总结(二)
  • 腾讯mini项目-【指标监控服务重构】2023-08-06
  • ruoyi菜单折叠,菜单收缩
  • Linux 用户和用户组
  • JavaBean文字格斗游戏(面向对象编程)的个人重写以及个人解释
  • 动态面板案例分析
  • vuepress+gitee免费搭建个人博客(无保留版)
  • Java中的隐式转换和强制转换底层是怎么做的?
  • Hbuilder本地调试微信H5项目(一)
  • OPC DCOM快速配置
  • 软件设计模式