LeetCode | C++ 动态规划——583. 两个字符串的删除操作、72. 编辑距离

news/2024/11/17 9:35:59/

目录

  • 583. 两个字符串的删除操作
  • 72. 编辑距离

583. 两个字符串的删除操作

583题目链接
做法一: 本题和1143.最长公共子序列基本相同,只要求出两个字符串的最长公共子序列长度即可,那么除了最长公共子序列之外的字符都是必须删除的,最后用两个字符串的总长度减去两个最长公共子序列的长度就是删除的最少步数。

做法二: 本题和115.不同的子序列 相比,其实就是两个字符串都可以删除了

dp[i] [j] 数组含义

以i - 1为结尾的字符串word1,和以j - 1为结尾的字符串word2,想要达到相等,所需要删除元素的最少次数。

递推公式

(1)word1[i - 1] 与 word[j - 1] 相等时,

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

(2)word1[i - 1] 与 word[j - 1] 不相等时,分为三种情况

一:删除word1[i - 1],最少操作次数为 dp[i - 1] [j] + 1

二:删除word2[j - 1], 最少操作次数为 dp[i] [j - 1] + 1

三:同时删除 word1[i - 1] 和 word2[j - 1], 最少操作次数为 dp[i - 1] [j - 1] + 2

最后取三者最小值:dp[i] [j] = min(dp[i - 1] [j] + 1, dp[i] [j - 1] + 1, dp[i - 1] [j - 1] + 2)

dp数组初始化

由递推公式得 dp[0] [j] 和 dp[i] [0] 都需要初始化,根据dp 数组定义得

dp[0] [j] = j

dp[i] [0] = i

遍历顺序

从左往右,从上到下

class Solution {
public:int minDistance(string word1, string word2) {vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1));for (int i = 0; i <= word1.size(); i++) {dp[i][0] = i;}for (int j = 0; j <= word2.size(); j++) {dp[0][j] = j;}for (int i = 1; i <= word1.size(); i++) {for (int j = 1; j <= word2.size(); 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] + 1, min(dp[i][j - 1] + 1, dp[i - 1][j - 1] + 2));}}}return dp[word1.size()][word2.size()];}
};

72. 编辑距离

72题目链接
dp[i] [j] 数组含义

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

递推公式

(1)如果word1[i - 1] 与 word2[j - 1] 相同:

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

(2)如果word1[i - 1] 与 word2[j - 1] 相同:又分为 3 种 增删改

删:dp[i] [j] = dp[i - 1] [j] + 1;

改:dp[i] [j] = dp[i - 1] [j - 1] + 1;

增:相当于 word2 删除元素, 即 为 以下标i - 1为结尾的 word1 与 j - 2 为结尾的最近编辑距离 + 一个操作

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

最后取三者之中最小的, dp[i] [j] = min(dp[i - 1] [j] + 1, min(dp[i - 1] [j - 1] + 1, dp[i] [j - 1] + 1))

dp数组初始化

由递推公式得,dp[0] [j] 和 dp[i] [0] 需要初始化

dp[0] [j] = j

dp[i] [0] = i

遍历顺序

根据递推公式得,从左到右,从上到下

class Solution {
public:int minDistance(string word1, string word2) {vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1));for (int i = 0; i <= word1.size(); i++) {dp[i][0] = i;}for (int j = 1; j <= word2.size(); j++) {dp[0][j] = j;}for (int i = 1; i <= word1.size(); i++) {for (int j = 1; j <= word2.size(); 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] + 1, min(dp[i - 1][j - 1] + 1, dp[i][j - 1] + 1));}}}return dp[word1.size()][word2.size()];}
};

http://www.ppmy.cn/news/956457.html

相关文章

Meta发布升级大模型LLaMA 2:开源可商用

论文地址&#xff1a;https://ai.meta.com/research/publications/llama-2-open-foundation-and-fine-tuned-chat-models/ Github地址&#xff1a;https://github.com/facebookresearch/llama LLaMA 2介绍 Meta之前发布自了半开源的大模型LLaMA&#xff0c;自从LLaMA发布以来…

基于nginx的waf方案naxsi源码理解(6)_策略处理

本文档说明 这里的策略处理以读取MainRule策略为例。 以naxsi_core.rules的首条策略做示例: MainRule "rx:select|union|update|delete|insert|table|from|ascii|hex|unhex|drop|load_file|substr|group_concat|dumpfile" "msg:sql keywords" "mz:…

MyBatis代理开发:简化数据访问层(DAO)的实现

引言 在现代的应用程序开发中&#xff0c;数据访问层&#xff08;DAO&#xff09;是连接应用程序与数据库之间的关键组件。MyBatis是一个流行的Java持久层框架&#xff0c;提供了一种简化数据访问层开发的方法&#xff0c;即代理开发。本文将介绍MyBatis代理开发的概念和使用方…

反其道而行,大学教授鼓励学生用 ChatGPT 写论文

整理 | 屠敏 责编 | 张红月 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 新 AI 工具 ChatGPT 的到来&#xff0c;正在教育圈呈现出冰火两重天的态势&#xff0c;教授们几家欢喜几家愁。 这不近日&#xff0c;来自宾夕法尼亚大学沃顿商学院的一位专门研究创…

一篇文章,教你彻底掌握接口测试!

Part 01、什么是接口测试 所谓接口&#xff0c;是指同一个系统中模块与模块间的数据传递接口、前后端交互、跨系统跨平台跨数据库的对接。而接口测试&#xff0c;则是通过接口的不同情况下的输入&#xff0c;去对比输出&#xff0c;看看是否满足接口规范所规定的功能、安全以及…

【回眸】又是一年毕业季,怎么利用ChatGPT 4.0 优化毕业论文?

目录 【回眸】又是一年毕业季&#xff0c;怎么利用ChatGPT 4.0 优化毕业论文&#xff1f; 前言 ChatGPT4.0降重提示词&#xff08;3.5表现略逊色一些&#xff0c;不过也可以用这个来作为提示词&#xff09; 举个例子 降重前的原文 构思提示词 确定提问词 选用合适的翻译…

用ChatGPT写论文,震惊了!

当代研究生内卷现状—— 每天在实验室熬到半夜鸡叫&#xff0c;but&#xff0c;该有的实验数据一个也没得。 为了准备组会前一天呕心沥血搞ppt&#xff0c;but&#xff0c;老师的一句论文进度怎么样&#xff0c;瞬间颤抖。 那个总是抓住空隙打游戏的学弟发了一篇一作二区&#…

什么?还能让ChatGPT自己给自己写提示(Prompt)?

作者&#xff1a;ChenZhen 博客地址&#xff1a;https://www.chenzhen.space/&#x1f310; 版权&#xff1a;本文为博主 ChenZhen 的原创文章&#xff0c;本文版权归作者所有&#xff0c;转载请附上原文出处链接及本声明。&#x1f4dd; 如果对你有帮助&#xff0c;请给一个小…