代码随想录打卡Day46

devtools/2024/12/23 1:52:18/

今天是动态规划的最后一天,终于要结束折磨了!!!今天的两道题,第一道看视频做的,第二道自己AC的,开心!!!!

647. 回文子串

这道题不能用一维dp数组来做,必须用二维dp数组,我认为这道题目的dp数组定义很关键,这道题的dp数组定义为:字符串在s[i]-s[j]的范围的字符串片段是否为回文串(true or false), 递推公式也不难想,首先讨论一般情况:当s[i] == s[j]时,如果i和j相差很远,那么i和j范围内的字符串是否为回文子串就取决于i + 1和j - 1包围住的字符串是否为回文子串,所以有dp[i][j] = dp[i + 1][j - 1];如果j - i <= 1(相邻或者指向同一字符),此时对应"a"或者"aa"的情况,这个时候直接令dp[i][j] = true即可。如果s[i] != s[j]的话,直接令dp[i][j] = false。
这道题不太注重初始化条件,但是有一点,绝对不能全部初始化成true就行。
另外,这道题的遍历顺序一定一定要注意,从递推公式来看,是从左下角向右上角推导的,所以遍历的时候需要从左往右,从下往上遍历!!!

class Solution {
public:int countSubstrings(string s) {//1.确定dp[i][j]的含义:字符串在s[i]-s[j]的范围的字符串片段是否为回文串(true or false), //2.确定递推公式dp[i][j] = dp[i + 1][j - 1];//          or dp[i][j] = false;//3.dp数组初始化 dp[i][j] = false;//4.确定遍历顺序:从左往右,从下往上遍历//5.打印数组(省略)int m = s.size();vector<vector<bool>> dp(m, vector<bool> (m, false));int result = 0;for(int i = m - 1; i >= 0; i--){for(int j = i; j < m; j++){if(s[i] == s[j]){if(j - i <= 1){  //i == j || i == j - 1dp[i][j] = true;result++;}     else{dp[i][j] = dp[i + 1][j - 1];if(dp[i][j]) result++;}    }}}return result;}
};

516.最长回文子序列

这道题目和上一道题还是有差别的,首先题目问的是最长回文子序列,如果dp数组还是存储布尔值的话,无法体现出回文子序列的长度,因此本题dp数组的定义为:字符串在s[i]-s[j]的范围的字符串片段中最长回文子串的长度为dp[i][j],在递推公式上,如果s[i] == s[j],如果在i和j相差很大的情况下,则dp[i][j]应当在内侧的最长回文子序列的基础上加2,如果j - i <= 1的情况下,dp[i][j] = j - i + 1;如果s[i] != s[j],则i + 1, j包围的字符串或者i,j - 1包围的字符串中仍有可能存在回文子序列,所以需要对这两种情况取较大值,存入dp[i][j]中,即dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])。
在初始化上也没有特别需要注意的地方,遍历顺序依然是从左往右,从下往上。

class Solution {
public:int longestPalindromeSubseq(string s) {//1.确定dp[i][j]的含义:字符串在s[i]-s[j]的范围的字符串片段中最长回文子串的长度为dp[i][j],//2.确定递推公式dp[i][j] = dp[i + 1][j - 1] + 2;//          or dp[i][j] = dp[i + 1][j] || dp[i][j - 1];//3.dp数组初始化 dp[i][j] = false;//4.确定遍历顺序:从左往右,从下往上遍历//5.打印数组(省略)int m = s.size();int result = 0;vector<vector<int>> dp(m, vector<int> (m, 0));for(int i = m - 1; i >= 0; i--){for(int j = i; j < m; j++){if(s[i] == s[j]){if(j - i <= 1)dp[i][j] = j - i + 1;elsedp[i][j] = dp[i + 1][j - 1] + 2;}elsedp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);}}return dp[0][m - 1];}
};

动态规划完结撒花!!!!


http://www.ppmy.cn/devtools/118663.html

相关文章

visual studio 调试技巧

visual studio 调试技巧 概述 在使用visual studio 进行调试的时候&#xff0c;有几个调试方法很好用&#xff0c;这里做一些记录。 GTEST 单元测试 参考 VS2022创建C C GTEST工程 - Hello-FPGA - 博客园 (cnblogs.com) 内存查看 命令行测试动态库 附加到进程调试动态库 …

❤ Node实现图片存储和文件存储

# Node13-图片存储接口本地 1、编写错误中间件​ 需要编写一个错误中间件&#xff0c;用来抛出错误&#xff0c;防止因为错误而造成接口崩溃 注意&#xff1a;错误中间件一定要放在所有路由之后 &#xff08;1&#xff09; 在所有路由之后放置中间件​ js app.use((err, …

软件架构设计师教程 第11章 11.4 边缘计算概述 笔记

11.4 边缘计算概述 ★★☆☆☆ 11.4.1 边缘计算概念 边缘计算将数据的处理、应用程序的运行甚至一些功能服务的实现&#xff0c;由 网络中心下放到网络边缘的节点上。在网络边缘侧的智能网关上就近采集并且处理数据&#xff0c;不需要上传原生数据。 11.4.2 边缘计算的定义 1…

VMware ESXi 8.0U3 macOS Unlocker OEM BIOS 2.7 Dell HPE 定制版 9 月更新发布

VMware ESXi 8.0U3 macOS Unlocker & OEM BIOS 2.7 Dell HPE 定制版 9 月更新发布 VMware ESXi 8.0U3 macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版 ESXi 8.0U3 标准版&#xff0c;Dell (戴尔)、HPE (慧与)、Lenovo (联想)、IEIT SYSTEMS (浪潮信息)、Cisco (思…

美畅物联丨GB/T 28181系列之TCP/UDP被动模式和TCP主动模式

GB/T 28181《安全防范视频监控联网系统信息传输、交换、控制技术要求》作为我国安防领域的重要标准&#xff0c;为视频监控系统的建设提供了全面的技术指导和规范。该标准详细规定了视频监控系统的信息传输、交换和控制技术要求&#xff0c;在视频流传输方面&#xff0c;GB/T 2…

论文笔记——Graph Bottlenecked Social Recommendation

文章地址 代码地址 1.1简介 随着社交网络的出现&#xff0c;社交推荐已经成为个性化服务的重要技术。最近&#xff0c;基于图的社交推荐通过捕捉高阶社交影响显示出了有希望的结果。大多数基于图的社交推荐的经验研究直接将观察到的社交网络纳入公式&#xff0c;并基于社交同…

随笔 JVM本质

为什么JVM可以被称为机器 (Machine) “学而时习之不亦说乎”&#xff0c;今天我们借着讨论标题这个问题&#xff0c;将JVM的全貌展示出来。 如果你是一名Java Coder,那么你一定听说过 “Write Once, Run Anywhere”&#xff0c;翻译过来就是一次编写到处运行。可能以现在的眼…

数组组成的最小数字 - 华为OD统一考试(E卷)

2024华为OD机试(E卷+D卷+C卷)最新题库【超值优惠】Java/Python/C++合集 题目描述 给定一个整型数组,请从该数组中选择3个元素组成最小数字并输出(如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 一行用半角逗号分割的字符串记录的整型数组,0<数…