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

目录

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 开始计数的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Obsidian的初步了解、安装及使用

一、为什么是Obsidian&#xff1f; 笔记软件我用的还是比较多了&#xff0c;一开始用有道云笔记&#xff0c;其实我个人觉得有道云笔记还是做的不错的&#xff0c;除了广告多点、功能弱一点、更新慢一点、偶尔收藏会有问题以外还是不错的&#xff0c;免费软件里性价比算是还可…

前端开发中地图定位与距离计算的应用实践

前端开发中地图定位与距离计算的应用实践 在前端开发中&#xff0c;地图功能的应用日益广泛&#xff0c;无论是用户位置的定位、目标距离的计算&#xff0c;还是地址的解析与展示&#xff0c;地图都发挥着不可替代的作用。本文将重点介绍前端开发中实现地图定位、距离计算以及…

windows 系统下全新下载安装 mysql8.0 数据库(详细)

windows 系统下全新下载安装 mysql8.0 数据库&#xff08;详细&#xff09; 段子手168 1、登录官方网站下载&#xff1a; https://dev.mysql.com/downloads/windows/installer/ 2、下载最新版本&#xff0c;一般可能需要注册登录&#xff0c;下载其他历史版本&#xff0c;请…

【LAMMPS学习】八、基础知识(1.3)从一个输入脚本运行多个模拟

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语&#xff0c;以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

【智能算法】省时方便,智能算法统计指标——一键运行~

目录 1.常用统计指标2.参数统计检验3.结果展示4.自定义修改测试框架 1.常用统计指标 测试智能算法性能时&#xff0c;常常会用到以下5种常用指标&#xff0c;简单不赘述&#xff1a; 最优值、最差值、均值、中位数、标准差 2.参数统计检验 单纯依靠常用统计指标说服力不足&…

【noVNC】使用noVNC实现浏览器网页访问vnc(基于web的远程桌面)

1.VNC本身提供的http连接方式&#xff0c;可传输文件&#xff0c;画面有卡顿&#xff0c;需要安装jre 2.noVNC访问方式&#xff0c;不可传输文件&#xff0c;画面较为流畅&#xff0c;不用安装插件运行环境 一、noVNC 是什么 Web 端的Vnc软件&#xff0c;通过noVNC&#xff0…

CSS 实现伸缩导航仪表板侧边栏菜单

CSS 实现伸缩导航仪表板侧边栏菜单 效果展示 展开状态 收起状态 CSS 知识点 回顾曲面圆角的实现知识点 字体库准备 菜单的图标使用的是ionicons的图标库&#xff0c;所以需要页面需要引入对应的文件。 <scripttype"module"src"https://unpkg.com/i…

进程间通信 (匿名管道)

一、进程间通信的概念 进程间通信是一个进程把自己的数据交给另一个进程&#xff0c;它可以帮助我们进行数据传输、资源共享、通知事件和进程控制。 进程间通信的本质是让不同的进程看到同一份资源。因此&#xff0c;我们要有&#xff1a; 1、交换数据的空间。2、这个空间不能由…

CNN-Transformer时间序列预测

部分代码&#xff1a; # CNN-Transformer class CNNTransformerEncoder(nn.Module):def __init__(self, input_features, transformer_encoder_heads,embedding_features, cnn_kernel_size, dim_feedforward_enc, n_encoder_layer):super(CNNTransformerEncoder, self).__init…

分析染色体级别的基因组装配揭示了六倍体栽培菊花的起源和进化-文献精读-7

Analyses of a chromosome-scale genome assembly reveal the origin and evolution of cultivated chrysanthemum 分析染色体级别的基因组装配揭示了栽培菊花的起源和进化 六倍体植物基因组的文献&#xff0c;各位同仁还有什么有特色的基因组评论区留言~ 摘要 菊花&#xf…

spring boot —— Spring-Cloud-Zuul(网关服务getway),kafka笔记

一、 引入zuul依赖&#xff1a; org.springframework.cloud spring-cloud-starter-zuul 二、创建应用主类。使用EnableZuulProxy注解开启zuul的API网关服务功能&#xff1a; EnableZuulProxy SpringCloudApplication public class Application { public static void mai…

【漏洞复现】WordPress Welcart 任意文件读取漏洞(CVE-2022-4140)

0x01 产品简介 Welcart 是一款免费的 WordPress 电子商务插件。Welcart 具有许多用于制作在线商店的功能和自定义设置。您可以轻松创建自己的原始在线商店。 0x02 漏洞概述 Welcart存在任意文件读取漏洞&#xff0c;未授权的攻击者可以通过该漏洞读取任意文件&#xff0c;获…

【RAG实践】Rerank,让大模型 RAG 更近一步

RAGRerank原理 上一篇【RAG实践】基于LlamaIndex和Qwen1.5搭建基于本地知识库的问答机器人 我们介绍了什么是RAG&#xff0c;以及如何基于LLaMaIndex和Qwen1.5搭建基于本地知识库的问答机器人&#xff0c;原理图和步骤如下&#xff1a; 这里面主要包括包括三个基本步骤&#…

【无标题】系统思考—心智模式

“直到你使无意识变为有意识&#xff0c;它将指导你的生活并且你会称之为命运。”—卡尔荣格 心智模式深藏于我们内心之中&#xff0c;它潜移默化地影响着我们对世界的理解和判断。往往这些影响是如此隐蔽&#xff0c;以至于我们自己都未必察觉到是什么在驱动我们的选择、决策…

ES7-10:async和await、异步迭代..

1-ES7新特性 indexof如果没有就返回-1&#xff0c;有就返回索引 如果仅仅查找数据是否在数组中,建议使用includes,如果是查找数据的索引位置,建议使用indexOf更好一些 2-ES8-async和await 所有的需要异步处理的Promise对象都写在async中await等待结果 async、await 使异步操…

【MATLAB源码-第184期】基于matlab的FNN预测人民币美元汇率 输出预测图误差图RMSE R2 MAE MBE等指标

操作环境&#xff1a; MATLAB 2022a 1、算法描述 前馈神经网络&#xff08;Feedforward Neural Network, FNN&#xff09;是最简单也是应用最广泛的人工神经网络之一。在许多领域&#xff0c;尤其是数据预测方面&#xff0c;FNN已经展现出了卓越的性能和强大的适应性。 一、…

贪心算法|406.根据身高重建队列

力扣题目链接 class Solution { public:static bool cmp(const vector<int>& a, const vector<int>& b) {if (a[0] b[0]) return a[1] < b[1];return a[0] > b[0];}vector<vector<int>> reconstructQueue(vector<vector<int>…

鸿蒙应用开发之图案密码锁组件

前面学习了导航组件,现在来学习另一个密码设置和验证组件,这种组件比较常用。因为当用触屏手机之后,屏幕上就可以滑动操作,比普通PC电脑要多一些功能了。早前的密码都是输入数字,没有滑动输入九宫格的密码。 大体如下面的界面: 采用这种密码,一般情况下是不用记住数字,…

Vue - 你知道Vue中key的工作原理吗

难度级别:中级及以上 提问概率:80% 在Vue项目开发中,并不推荐使用索引做为key,以为key必须是唯一的,可以使用服务端下发的唯一ID值,也不推荐使用随机值做为key,因为如果每次渲染都监听到不一样的key,那么节点将无法复用,这与Vue节省…

Kotlin:常用标准库函数(let、run、with、apply、also)

一、let 扩展函数 Kotlin标准库函数let可用于范围确定和空检查。当调用对象时&#xff0c;let执行给定的代码块并返回其最后一个表达式的结果。对象可以通过引用(默认情况下)或自定义名称在块中访问。 let扩展函数源码 let.kt文件代码 fun main() {println("isEmpty $is…