LeetCode 热题 100 | 多维动态规划(二)

news2024/12/23 7:39:31

目录

1  5. 最长回文子串

2  1143. 最长公共子序列


菜鸟做题,语言是 C++

1  5. 最长回文子串

核心思想:把总问题拆解为若干子问题。

  • 总问题:从第 i 个字母到第 j 个字母是回文串
  • 子问题:从第 i + 1 个字母到第 j - 1 个字母是回文串、第 i 个字母等于第 j 个字母
  • 总问题 = 子问题 1 + 子问题 2

思路说明图:如下图所示,要使 “从第 i 个字母到第 j 个字母是回文串”,必须满足 “从第 i + 1 个字母到第 j - 1 个字母是回文串” 和 “第 i 个字母等于第 j 个字母” 这两个条件。

很自然地想到设置一个 dp 二维数组,其中的 dp[i][j] 用于记录 “从第 i 个字母到第 j 个字母” 是否是回文串。如果是,则 dp[i][j] = 1;否则,dp[i][j] = 0 。

最初可能会想到这样写循环:

for (int i = 0; i < n; ++i) {
    for (int j = i; j < n; ++j) {
        dp[i][j] = dp[i + 1][j - 1] && s[i] == s[j];
    }
}

但问题在于,当我们计算 dp[i][j] 的时候,dp[i + 1][j - 1] 还没有被算出来。

因此,我们把 “从前往后” 遍历改为 “从后往前” 遍历:

for (int i = n - 1; i >= 0; ++i) {
    for (int j = i; j < n; ++j) {
        dp[i][j] = dp[i + 1][j - 1] && s[i] == s[j];
    }
}

由于 i = n - 1 会导致 dp[i + 1][j - 1] 访问越界,因此我们还会加入一些判断条件。

class Solution {
public:
    string longestPalindrome(string s) {
        int n = s.size();
        if (n < 2) return s;

        vector<vector<int>> dp(n, vector<int>(n, 0));
        string ans;
        for (int i = n - 1; i >= 0; --i) {
            for (int j = i; j < n; ++j) {
                if (i + 1 <= j - 1) {
                    dp[i][j] = dp[i + 1][j - 1] && s[i] == s[j];
                } else {
                    dp[i][j] = s[i] == s[j];
                }
                
                if (dp[i][j] && s.substr(i, j - i + 1).size() > ans.size())
                    ans = s.substr(i, j - i + 1);
            }
        }

        return ans;
    }
};

说明:if (i + 1 <= j - 1) 是在判断什么?

上图给出了 “i 和 j 之间没有夹子串” 的两种情况,我们直接判断 s[i] 和 s[j] 是否相等即可。

2  1143. 最长公共子序列

核心思想:把总问题拆解为若干子问题。

  • 总问题:text1 前 i 个字母和 text2 前 j 个字母有多少个相同
  • 子问题:text1 前 i/i-1 个字母和 text2 前 j-1/j 个字母有多少个相同
  • 总问题 = 子问题 1 + 子问题 2

思路说明图:设置一个 dp 二维数组,其中 dp[i][j] 代表 text1 前 i 个字母和 text2 前 j 个字母的相同个数。假设 text1[i] 和 text2[j] 不同,那么 dp[i][j] 只能从 dp[i][j - 1] 和 dp[i - 1][j] 中继承一个,由于是在求最长,因此继承二者中的较大者。

如果 text1[i] 和 text2[j] 相同,则 dp[i][j] = dp[i - 1][j - 1] + 1,而不能从 dp[i][j - 1] 和 dp[i - 1][j] 中继承,否则会导致 text1[i] 或 text2[j] 被重复使用。

class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        int m = text1.size();
        int n = text2.size();

        vector<vector<int>> dp(m + 1, vector<int>(n + 1));
        for (int i = 1; i <= m; ++i) {
            for (int j = 1; j <= n; ++j) {
                if (text1[i - 1] == text2[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                } else {
                    dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);
                }
            }
        }

        return dp[m][n];
    }
};

这里 dp 增加了一行和一列当哨兵,防止 dp[i - 1][j - 1] 等访问越界。相应地,在访问 text1 和 text2 字符串时 i 和 j 要减一,因为 text1 和 text2 是从 0 开始计数的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1583692.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【就近接入,智能DNS-Geo DNS ,大揭秘!】

做过后端服务或者网络加速的小伙伴&#xff0c;可能或多或少都听说过&#xff0c;智能DNS或者Geo DNS&#xff0c;就是根据用户的位置&#xff0c;返回离用户最近的服务节点&#xff0c;就近接入&#xff0c;以达到服务提速的效果。 那么大家有没想过&#xff0c;这个背后的原理…

ETLCloud结合kafka的数据集成

一、ETLCloud中实时数据集成的使用 在ETLCloud中数据集成有两种方式&#xff0c;一种是离线数据集成&#xff0c;另一种便是我们今天所要介绍的实时数据集成了&#xff0c;两者的区别从名字便可以得知&#xff0c;前者处理的数据是离线的没有时效性的&#xff0c;后者的数据是…

【Keil5-Boot和APP配置】

Keil5-Boot和App配置 ■ Keil5-Boot和APP配置■ 一&#xff1a;sct文件 sct文件配置■ 二&#xff1a;发布版本不需要在 C/C&#xff0c;Asm&#xff0c;Linker&#xff0c;中添加 CMDDEBUG 宏定义。■ 三&#xff1a;Debug版本需要在Linker添加 --pd"-DCMDDEBUG" 才…

4.进程相关 2

8.内存映射 8.1 内存映射相关定义 创建一个文件&#xff0c;将保存在磁盘中的文件映射到内存中&#xff0c;后期两个进程之间对内存中的数据进行操作&#xff0c;大大减少了访问磁盘的时间&#xff0c;也是一种最快的 IPC &#xff0c;因为进程之间可以直接对内存进行存取 8.…

视觉大模型--DeformableDETR

原理大家可以参考这篇文章&#xff0c;我这边主要介绍几个公式和整体源码理解。 提出了多尺度可变形注意力(Multi-scale Deformable Attention, MSDA).基于此设计了 DETR 特有的利用多尺度特征检测的流程&#xff0c;对之后的很多工作有指导意义。提出了两阶段 DETR 的思路&…

OpenHarmony应用开发引入开源C/C++库---之Har包里的NDK

Har 包 HAR&#xff08;Harmony Archive&#xff09;是静态共享包&#xff0c;可以包含代码、C 库、资源和配置文件。通过 HAR 可以实现多个模块或多个工程共享 ArkUI 组件、资源等相关代码。HAR 不同于 HAP&#xff0c;不能独立安装运行在设备上&#xff0c;只能作为应用模块…

pandas常用的一些操作

EXCLE操作 读取Excel data1 pd.read_excel(excle_dir) 读Excel取跳过前几行&#xff1a; data1 pd.read_excel(excle_dir,skiprows1) 获取总行数 data1.shape[0] 获取总列数 data1.shape[1] 指定某列数据类型 data1 pd.read_excel("C:数据导入.xlsx",dtype…

设计模式——装饰器模式09

装饰器模式&#xff1a;是在原有基础上进行装饰&#xff08;无修改原来代码&#xff09;&#xff0c;来添加新的功能。 例如下面对普通耳机进行装饰。 设计模式&#xff0c;一定要敲代码理解 修饰对象&#xff08;抽象&#xff09; /*** author ggbond* date 2024年04月07日…

Unity核心学习

目录 认识模型的制作流程模型的制作过程 2D相关图片导入设置图片导入概述纹理类型设置纹理形状设置纹理高级设置纹理平铺拉伸设置纹理平台打包相关设置 SpriteSprite Editor——Single图片编辑Sprite Editor——Multiple图片编辑Sprite Editor——Polygon图片编辑SpriteRendere…

【汇编语言实战】统计个数(创新版)

内存中有10个分布在0至100内的正整数&#xff0c; 求小于60的数的个数num1&#xff0c;大于或等于60且小于80的数的个数num2&#xff0c;大于或等于80且小于100的数的个数num3 C语言描述该程序流程&#xff1a; #include <stdio.h> int main() {int a[]{1, 20, 95, 32,…

Python | 超前滞后分析

Nino SST Indices (Nino 12, 3, 3.4, 4; ONI and TNI) 有几个指标用于监测热带太平洋&#xff0c;所有这些指标都是基于海表温度(SST)异常在一个给定的区域的平均值。通常&#xff0c;异常是相对于30年的周期来计算的。厄尔尼诺3.4指数(Nio 3.4 index)和海洋厄尔尼诺指数(Ocea…

【Ubuntu】update-alternatives 命令详解

1、查看所有候选项 ​​​​​​​sudo update-alternatives --list java 2、​​​​​​​更换候选项 sudo update-alternatives --config java 3、自动选择优先级最高的作为默认项 sudo update-alternatives --auto java 4、删除候选项 sudo update-alternatives --rem…

MATLAB技巧:箱型图绘制

箱型图/箱线图 箱型图&#xff08;Box Plot&#xff09;&#xff0c;也称为盒须图或箱线图&#xff0c;是一种用于展示数据分布情况的统计图表。它通过展示数据的中位数、上下四分位数、最大值和最小值&#xff0c;可以直观地显示出数据的离散程度、偏态和异常值等信息。 箱型…

Python实现读取dxf文件的所有字符

Python实现读取dxf文件的所有字符 import ezdxfdef read_dxf_and_print_text(filename):# 加载DXF文件doc ezdxf.readfile(filename)# 遍历所有的实体for entity in doc.entities:# 检查实体是否是TEXT、MTEXT或DIMENSIONif isinstance(entity, ezdxf.entities.Text):print(f…

从头训练、采用预训练模型这两种方法在图像分类上的实践

参考书籍《Python深度学习》Chapter 5《深度学习用于计算机视觉》 演示数据&#xff1a;Dogs vs. Cats | Kaggle 1. 从头训练模型 1.1 不使用数据增强 1.2 使用数据增强 2. 使用预训练模型 去掉已有模型的最后的分类层。 2.1 直接使用已有模型的结果&#xff0c;再输入到新建…

【快捷部署】015_Minio(latest)

&#x1f4e3;【快捷部署系列】015期信息 编号选型版本操作系统部署形式部署模式复检时间015MiniolatestCentOS 7.XDocker单机2024-04-09 一、快捷部署 #!/bin/bash ################################################################################# # 作者&#xff1a;c…

处理慢查询时使用explain一般看哪些字段

explain之后会出现这些&#xff0c;一般就只看下面这几个字段 select_type就是查询类型&#xff0c;在我司的业务里基本上用的都是简单查询&#xff0c;在内存中处理逻辑&#xff0c;复杂查询的话排查问题比较麻烦&#xff0c;引起慢查询还会拖累数据库&#xff0c;数据库里还…

Day:005 | Python爬虫:高效数据抓取的编程技术(爬虫效率)

爬虫之多线程-了解 单线程爬虫的问题 因为爬虫多为IO密集型的程序&#xff0c;而IO处理速度并不是很快&#xff0c;因此速度不会太快如果IO卡顿&#xff0c;直接影响速度 解决方案 考虑使用多线程、多进程 原理&#xff1a; 爬虫使用多线程来处理网络请求&#xff0c;使用线程…

python爬虫———激发学习兴趣的案列(第十三天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

OpenHarmony开发技术:【国际化】实例

国际化 如今越来的越多的应用都走向了海外&#xff0c;应用走向海外需要支持不同国家的语言&#xff0c;这就意味着应用资源文件需要支持不同语言环境下的显示。本节就介绍一下设备语言环境变更后&#xff0c;如何让应用支持多语言。 应用支持多语言 ArkUI开发框架对多语言的…