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

【Day59】代码随想录之动态规划_647回文子串_516最长回文子序列

文章目录

      • 动态规划理论基础
        • 动规五部曲:
        • 出现结果不正确:
      • 1. 647回文子串
      • 2. 516最长回文子序列

动态规划理论基础

动规五部曲:
  1. 确定dp数组 下标及dp[i] 的含义。
  2. 递推公式:比如斐波那契数列 dp[i] = dp[i-1] + dp[i-2]。
  3. 初始化dp数组。
  4. 确定遍历顺序:从前到后or其他。
  5. 打印。
出现结果不正确:
  1. 打印dp日志和自己想的一样:递推公式、初始化或者遍历顺序出错。
  2. 打印dp日志和自己想的不一样:代码实现细节出现问题。

1. 647回文子串

参考文档:代码随想录

分析:
判断一个字符串里面的有多少个回文串,需要二维dp数组,dp[i][j]表示字符串s的[i, j]之间有多少个回文字符串。当s[i] == s[j]的时候,有可能是回文串,i = j 或者 i和j相差一个时是回文串,如果i和j相差的大于1,则需要判断[i+1, j-1]是否是回文串了。而当s[i] != s[j]的时候,s的[i, j]肯定不是回文串,这也表示dp的初始化是false。

dp五部曲:

  1. dp[i][j]含义:表示s[i, j]回文串的个数。统计一个字符串中回文串的个数,使用的是bool型的数组,如果dp[i][j] = true;那么最终的回文串个数加1,而不是记录有多少个回文子串。数组类型的设计也很有意思。
  2. 递推公式:if(s[i] == s[j]) { if(j - i <= 1) {dp[i][j] = true; } else { dp[i][j] = dp[i+1][j-1]; } }
  3. 初始化:dp[i][j] = false;
  4. 遍历顺序:根据递推公式可以得知当前的dp[i][j]有可能需要借助左下方的dp[i+1][j-1],所以遍历顺序是从下到上,先更新下面一行的数据;之后从左到右,先更新左侧的数据。

代码:

class Solution {
public:int countSubstrings(string s) {//dp[i]: 以i结尾的回文子串的个数tvector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false));int sum = 0;//注意遍历的顺序是从下到上,从左到右的for(int i = s.size() - 1; i >= 0; i--){for(int j = i; j < s.size(); j++){if(s[i] == s[j]) {if(j - i <= 1) {dp[i][j] = true;sum++;}else if(dp[i+1][j-1]){dp[i][j] = true;sum++;}}}}return sum;}
};

2. 516最长回文子序列

参考文档:代码随想录

分析:
和上一题回文子串不同的地方在于这次的回文子序列不要求是连续的。所以还采用和上一题一样的方法使用二维的dp数组。但是为了更新回文子串的长度,需要将数组的类型设为int型。

dp五部曲:

  1. dp[i][j]含义:表示字符串s中[i, j]之间的最长回文子序列。
  2. 递推公式:if(s[i] == s[j]) dp[i][j] = dp[i+1][j-1] + 2; else dp[i][j] = max(dp[i+1][j], dp[i][j-1]);

在这里插入图片描述

  1. 初始化:dp[i][i] = 1。其余为0。
  2. 遍历顺序:根据递推公式,遍历顺序是从下到上,先把下一行的数据更新好,根据下一行的数据更新本行的数据;从左到右,先更新左侧的数据,根据左侧的数据更新本位置的数据。

在这里插入图片描述

代码:

class Solution {
public:int longestPalindromeSubseq(string s) {//返回最长回文串的长度,数组类型是int型vector<vector<int>> dp(s.size(), vector<int>(s.size(), 0));//初始化for(int i = 0; i < s.size(); i++) dp[i][i] = 1;//更新dpfor(int i = s.size() - 1; i >= 0; i--){for(int j = i + 1; j < s.size(); j++){if(s[i] == s[j]) dp[i][j] = dp[i+1][j-1] + 2;else{dp[i][j] = max(dp[i+1][j], dp[i][j-1]);}}}return dp[0][s.size() - 1];}
};

相关文章:

【Day59】代码随想录之动态规划_647回文子串_516最长回文子序列

文章目录 动态规划理论基础动规五部曲&#xff1a;出现结果不正确&#xff1a; 1. 647回文子串2. 516最长回文子序列 动态规划理论基础 动规五部曲&#xff1a; 确定dp数组 下标及dp[i] 的含义。递推公式&#xff1a;比如斐波那契数列 dp[i] dp[i-1] dp[i-2]。初始化dp数组…...

ECLIP

denote the representation of the positive prompt produced by the momentum model as h ξ i h_{\xi}^{i} hξi​ 辅助信息 作者未提供代码...

STM32 +合宙1.54“ 电子墨水屏(e-paper)驱动显示示例

STM32 合宙1.54“ 电子墨水屏&#xff08;e-paper&#xff09;驱动显示示例 &#x1f4cd;相关篇《Arduino框架下ESP32/ESP8266合宙1.54“ 电子墨水屏&#xff08;e-paper&#xff09;驱动显示示例》&#x1f516;程序是从GooDisplay品牌和微雪电子下同型号规格墨水屏的示例程序…...

使用Postman和JMeter进行signature签名

一、前言 ​ 有些接口的请求会带上sign&#xff08;签名&#xff09;进行请求&#xff0c;各接口对sign的签名内容、方式可能不一样&#xff0c;但一般都是从接口的入参中选择部分内容组成一个字符串&#xff0c;然后再进行签名操作, 将结果赋值给sign; 完整规范的接口文档都会…...

uni-app nvue vue3 setup中实现加载webview,解决nvue中获取不到webview实例的问题

注意下面的方法只能在app端使用&#xff0c; let wv plus.webview.create("","custom-webview",{plusrequire:"none", uni-app: none, width: 300,height:400,top:uni.getSystemInfoSync().statusBarHeight44 }) wv.loadURL("https://ww…...

IPD(集成产品开发)—核心思想

企业发展到一定阶段就会遇到管理瓶颈&#xff0c;IPD流程是一种高度结构化的产品开发流程&#xff0c;它集成了业界很多优秀的产品开发方法论&#xff0c;像搭积木一样的组合成一种非常有效的流程。如果我们能根据企业的规模和行业特点&#xff0c;对全流程的IPD进行合适的裁剪…...

uniapp android 原生插件开发-测试流程

前言 最近公司要求研究一下 uniapp 的 android 原生插件的开发&#xff0c;为以后的工作做准备。这篇文章记录一下自己的学习过程&#xff0c;也帮助一下有同样需求的同学们 : ) 一、下载安装Hbuilder X , Android studio&#xff08;相关的安装配置过程网上有很多&#xff0c;…...

MyCAT从入门到实战(配置文件介绍)

用户&#xff08;user&#xff09; 配置文件位置mycat/conf/user/root.user.json。这个配置文件主要是用来配置MyCAT的登录用户 的&#xff0c;也就是我们连接8066这个端口的用户信息。 [rootservice bin]# cat /usr/local/mycat/conf/users/root.user.json {"dialect&q…...

【LeetCode-300】最长递增子序列(动归)

目录 题目描述 解法1&#xff1a;动态规划 代码实现 题目链接 题目描述 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例…...

Mysterious-GIF-攻防世界-MISC

题目简介&#xff1a; 下载得到gif文件&#xff0c;十六进制编辑器查看&#xff0c;发现末尾有50 4B 03 04文件头。提取后保存为zip文件。 解压该zip文件&#xff0c;得到temp.zip。十六进制编辑器查看temp.zip&#xff0c;会发现有多个文件头和文件尾。 用binwalk分离temp.zi…...

【数据结构和算法初阶(C语言)】链表-单链表(手撕详讲单链表增删查改)

目录 1.前言&#xff1a;顺序表回顾&#xff1a; 1.1顺序表的优缺点 2.主角----链表 2.1链表的概念 2.2定义一个单链表的具体实现代码方式 3.单链表对数据的管理----增删查改 3.1单链表的创建 3.2单链表的遍历实现 3.2.1利用遍历实现一个打印我们链表内容的函数的函数…...

【Go语言】Go语言中的切片

Go语言中的切片 1.切片的定义 Go语言中&#xff0c;切片是一个新的数据类型数据类型&#xff0c;与数组最大的区别在于&#xff0c;切片的类型中只有数据元素的类型&#xff0c;而没有长度&#xff1a; var slice []string []string{"a", "b", "c…...

Qt程序设计-钟表自定义控件实例

本文讲解Qt钟表自定义控件实例。 效果如下: 创建钟表类 #ifndef TIMEPIECE_H #define TIMEPIECE_H#include <QWidget> #include <QPropertyAnimation> #include <QDebug> #include <QPainter> #include <QtMath>#include <QTimer>#incl…...

Redis的发布订阅功能教程,实现实时消息和key过期事件通知功能

Redis的发布订阅 Redis的发布/订阅(Pub/Sub)功能是一种消息传递模式,用于实现消息发布者(publisher)和订阅者(subscriber)之间的消息通信。在这种模式下,消息的发送者(发布者)将消息发送到特定的频道(channel),而订阅了该频道的接收者(订阅者)将会接收到这些消息…...

4核8g服务器能支持多少人访问?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…...

【Android】切换系统全局语言设置

前两种为应用内部处理&#xff0c;第三种为发送广播由系统服务进行处理 使用反射 这种会直接将安卓设置内的语言列表清空&#xff0c;然后将选择的语言设置为系统语言 该方法存在问题&#xff0c;在首次开机后设置会导致国外应用进不去(只对于here地图个别版本) /*** 设置语言…...

【递归】【回溯】Leetcode 112. 路径总和 113. 路径总和 II

【递归】【回溯】Leetcode 112. 路径总和 113. 路径总和 II 112. 路径总和解法&#xff1a;递归 有递归就有回溯 记得return正确的返回上去 113. 路径总和 II解法 递归 如果需要搜索整棵二叉树&#xff0c;那么递归函数就不要返回值 如果要搜索其中一条符合条件的路径&#xff…...

AxureCloud配置文件详细介绍

AxureCloud配置文件详细介绍 原文地址&#xff1a;https://docs.axure.com/axure-cloud/business/custom-settings-json/ 通过修改 customsettings.json 可以修改AxureCloud私有部署的域名、端口、HTTPS、存储目录、是否开启插件等, 默认安装的路径为: C:\Program Files\Axure…...

Centos开机网卡自启动失败

问题背景 每次都要手动启动在这里插入代码片 解决方案: 关闭 NetworkManager 服务 systemctl disable NetworkManager systemctl stop NetworkManager重启就会发现网卡已经可以自动启动了...

华为OD技术面试案例3-2024年

技术一面&#xff1a; 1.手撕代码&#xff0c;算法题&#xff1a; 【最小路径和】 手撕代码通过&#xff0c;面试官拍了照片 2.深挖项目&#xff0c;做过的自认为最好的一个项目&#xff0c;描述做过的项目的工作过程&#xff0c;使用到哪些技术&#xff1f; 技术二面&…...

快速上手VibeVoice:从环境检查到生成第一段AI配音

快速上手VibeVoice&#xff1a;从环境检查到生成第一段AI配音 1. 准备工作&#xff1a;了解VibeVoice VibeVoice是微软开源的一款轻量级实时语音合成系统&#xff0c;基于VibeVoice-Realtime-0.5B模型构建。它最大的特点是能够在输入文本后约300毫秒内开始播放语音&#xff0…...

python minikube

## 关于Python和Minikube&#xff0c;一些你可能没细想的细节 最近在容器化和本地开发环境搭建的话题里&#xff0c;Minikube被提到的次数越来越多了。但很多Python开发者第一次接触它时&#xff0c;难免会有些疑惑&#xff1a;这玩意儿和Python开发到底有什么关系&#xff1f;…...

Matchering 在直播和播客中的应用:实时音频优化的可能性

Matchering 在直播和播客中的应用&#xff1a;实时音频优化的可能性 【免费下载链接】matchering &#x1f39a;️ Open Source Audio Matching and Mastering 项目地址: https://gitcode.com/gh_mirrors/ma/matchering Matchering 是一款开源音频匹配与母带处理工具&am…...

别再让视频裸奔了!手把手教你用PolyV思路给m3u8视频上三道锁(含动态Key实战)

企业级视频版权保护实战&#xff1a;构建动态加密的三重防御体系 最近帮一家在线教育平台做技术咨询时&#xff0c;他们刚上线的付费课程视频不到一周就被扒得干干净净——各种下载工具直接抓取m3u8清单&#xff0c;批量下载ts切片&#xff0c;甚至有人把完整课程挂在二手平台低…...

Linux输入子系统实战:从struct input_event到鼠标、键盘、触屏事件解析与编程

1. Linux输入子系统入门&#xff1a;从设备文件到事件流 刚接触Linux输入子系统时&#xff0c;我花了整整三天才搞明白/dev/input/eventX这些神秘文件背后的门道。简单来说&#xff0c;Linux把所有的输入设备——键盘、鼠标、触摸屏、游戏手柄——都抽象成了文件。当你按下键盘…...

企业云盘选型标准合同条款:数据归属/服务等级/SLA全解析

作者&#xff1a;巴别鸟技术团队 适用场景&#xff1a;IT采购、合规审查、法务评估 更新时间&#xff1a;2026-04引言&#xff1a;为什么选云盘先看合同&#xff1f; 企业选择云盘时&#xff0c;大多数人盯着功能对比、UI体验、存储价格——但真正踩过坑的IT负责人知道&#xf…...

从收音机到WiFi滤波器:并联谐振电路在实际产品中的设计与避坑指南

从收音机到WiFi滤波器&#xff1a;并联谐振电路在实际产品中的设计与避坑指南 在电子工程领域&#xff0c;谐振电路就像一位隐形的调音师&#xff0c;默默地为各种电子设备筛选出需要的频率信号。从老式收音机里传出的悠扬音乐&#xff0c;到现代WiFi设备中高速传输的数据流&am…...

一根网线搞定光猫供电:用TP-LINK TL-POE150S+TL-POE10R实现千兆POE分离的保姆级教程

一根网线搞定光猫供电&#xff1a;用TP-LINK TL-POE150STL-POE10R实现千兆POE分离的保姆级教程 家里只有一根网线入户&#xff0c;却要同时解决光猫供电和千兆网络传输&#xff1f;这个看似无解的难题&#xff0c;其实只需要两件标准POE设备就能完美解决。作为一名折腾过无数家…...

C语言完美演绎8-10

/* 范例&#xff1a;8-10 */#include <stdio.h>void arith(int *k, int j) /* 以指针来接收传入数组的首地址 */{int a;for (a0;a<j;a){printf("i[%d]%d\n",a,k[a]);}}void main(){int i[]{1,8,5};arith(i,3); /* 调用函数arith()并传入数组i首地址与数组…...

别再手动切换了!用Creo二次开发自动识别钣金件与实体零件,提升设计效率

别再手动切换了&#xff01;用Creo二次开发自动识别钣金件与实体零件&#xff0c;提升设计效率 在机械设计领域&#xff0c;Creo作为主流的三维CAD软件&#xff0c;其强大的建模能力深受工程师青睐。然而&#xff0c;当设计任务涉及混合类型的零件——特别是同时包含钣金件和实…...