算法|Day49 动态规划17

LeetCode 647- 回文子串

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

题目描述:给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。

回文字符串 是正着读和倒过来读一样的字符串。

子字符串 是字符串中的由连续字符组成的一个序列。

具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。

解题思路

  1. 确定dp数组(dp table)以及下标的含义

可能上来就会想dp[i][j]定义成,在这个范围内回文子串的个数,这样定义不好找递推关系,定义成dp[i][j] 表示s在下标[i,j]区间内,是否为回文串。可以很容易找到递推关系,也就是dp[i][j]是否是回文子串我们只需要先判断s[i] 是否等于s[j],然后在看dp[i+1][j-1]也就是缩小范围后是否是回文子串,就能推出dp[i][j]

  1. 确定递推公式

首先分两种情况,当前字符相等不相等,

不相等时我们不做处理,在初始化的时候将所有值都设置为false。

若相等,则需要分三种情况

    • 情况一:i和j的差值为0,也就是指向同一个字符a,一定是回文子串,也就是dp[i][j] = true
    • 情况二:i和j的差值为1,也就是这俩字符相等且其中没有别的字符如aa,也就是dp[i][j] = true
    • 情况三:i和j的差值大于1,也就是中间有很多字符,这时我们就需要判断其子串是否为回文串了,也就是看dp[i+1][j-1]是否为真,为真则dp[i][j] = true,否则不处理。

故递推公式就是:

if (s[i] == s[j]) {if (j - i <= 1) { // 情况一 和 情况二result++;dp[i][j] = true;} else if (dp[i + 1][j - 1]) { // 情况三result++;dp[i][j] = true;}
}
  1. dp数组如何初始化

由于我们开始不知道哪些是回文串,所以dp数组在最开始我们全部都初始化为false。

  1. 确定遍历顺序

依据递推公式我们可以看出,每次更新我们都是从左下角往右更新,所以我们从下往上,从左往右遍历dp数组来更新。

  1. 举例推导dp数组
class Solution {
public:int countSubstrings(string s) {vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false));int result = 0;for (int i = s.size() - 1; i >= 0; i--) {  // 注意遍历顺序for (int j = i; j < s.size(); j++) {if (s[i] == s[j]) {// 当前字符相等后才来判断i j 差值,也就是判断中间是否有别的字符if (j - i <= 1) { result++;dp[i][j] = true;} else if (dp[i + 1][j - 1]) { // 情况三result++;dp[i][j] = true;}}}}return result;}
};

总结:

  • 这题的dp数组定义,需要思考一下,我们一般都直观的定义为题目需要求解的答案。而这题是定义成了是否为回文串,因为这样才能找到递推的规律。以后做题要注意,动态规划需要找递推公式这样想着来定义dp数组。

LeetCode 516.最长回文子序列

题目链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

题目描述:给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。

子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。

解题思路

1.确定dp数组(dp table)以及下标的含义

dp[i][j]:s字符串在[i,j]区间内最长回文子串的长度。

2.确定递推公式

我们需要分情况讨论,首先字符串1与字符串2当前字符相等或不等的情况,

  • 相等,则不进行操作。也就是dp[i][j] = dp[i-1][j-1] + 2图示:

  • 不相等时有两种情况,我们取其中的最大值故

dp[i][j] = min(dp[i-1][j],dp[i][j-1])

3.dp数组如何初始化

当 i == j的时候值为1,其余全部都为0,也就是每个字符串本身是回文子串,其余的全部默认为0。

4.确定遍历顺序

依据递推公式我们可以看出,dp[i][j]是由左下角的状态推导而来,故我们应该从下往上,从左往右遍历

5.举例推导dp数组

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

总结:

  • 本题关键还是要理解dp数组的含义,要将其牢记在心,这样才能真正弄懂一道题。

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

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

相关文章

免费音乐下载网站分享(MP3文件格式)

免费音乐下载网站分享&#xff08;MP3文件格式&#xff09; 最近需要下载一些歌曲&#xff0c;发现很多音乐app上下载文件都需要vip&#xff0c;再上网查询了一番&#xff0c;最后发现了一个宝藏网站&#xff0c;可以免费下载各种格式的MP3文件&#xff0c;在这里给大家分享一…

Python+Appium自动化测试-编写自动化脚本

之前已经讲述怎样手动使用appium-desktop启动测试机上的app&#xff0c;但我们实际跑自动化脚本的过程中&#xff0c;是需要用脚本调用appium启动app的&#xff0c;接下来就尝试写Python脚本启动app并登陆app。环境为Windows10 Python3.7 appium1.18.0 Android手机 今日头条…

Android USB电源管理

The USB peripheral detects the lack of 3 consecutive SOF packets as a suspend request from the USB host. 1 驱动shutdown顺序 系统关机或重启的过程中&#xff0c;会调用设备驱动的shutdown函数来完成设备的关闭操作&#xff0c;有需要的设备可以在驱动中定义该函数。其…

pyqt与opencv-qt冲突解决办法

问题&#xff1a;pyqt显示不出界面 问题分析&#xff1a; 根据报错可以看出程序找到了libxcb.so&#xff0c;但是由于某些原因并不能够调用该驱动&#xff0c;这是因为pyqt5与opencv里的qt差生了冲突&#xff0c;这说明opencv内部的插件与pyqt5所使用的插件不兼容&#xff0c;因…

面试问题总结(2)

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

类和对象(2)

文章目录 1.类的6个默认成员函数&#xff08;天选之子&#xff09;2.构造函数3.析构函数3.1特性 4.拷贝构造 1.类的6个默认成员函数&#xff08;天选之子&#xff09; C语言中&#xff0c;可能中途return也可能最后return&#xff0c;destroy的地方很多&#xff0c;比较麻烦。…

数据在内存中的存储

目录 数据类型 大小端 判断大小端 练习 1 2 浮点数在内存中储存 存M 存E 取E 数据类型 整形家族&#xff1a; char unsigned char signed char short unsigned short [int] signed short [int] int unsigned int signed int long unsigned long [int] signed…

云原生服务无状态(Stateless)特性的实现

文章目录 为何要使用无状态服务&#xff1f;无状态服务的实现方法1. 会话状态外部化2. 负载均衡3. 自动伸缩4. 容器编排5. 数据存储6. 安全性 示例&#xff1a;使用Spring Boot实现无状态服务结论 &#x1f389;欢迎来到云计算技术应用专栏~云原生服务无状态&#xff08;Statel…

BOM操作

文章目录 BOM事件页面加载调整窗口事件定时器停止计时器Location对象History对象Offsetleft获取元素偏移Offset与style的区别可视区client系列滚动scroll系列Mouseover和mousenter区别 动画原理实现动画封装给不同对象添加定时器缓动动画原理多个位置间移动 BOM事件 页面加载 …

【Tomcat服务部署及优化】

Tomcat 一、什么是Tomcat?二、Tomcat 核心组件2.1 Tomcat 组件2.3 Container组件的结构2.4 Tomcat 请求过程 三、Tomcat 部署3.1 安装JDK3.2 设置JDK环境变量3.3 安装Tomcat并用supervisor启动解压添加到supervisord服务测试能否通过supervisorctl启动 四、Tomcat的端口和主要…

普中51-蜂鸣器实验

蜂鸣器实验 蜂鸣器主要分为压电式蜂鸣器和电磁式蜂鸣器两种类型 压电式蜂鸣器主要由多谐振荡器、压电蜂鸣片、阻抗匹配器及共鸣箱、外壳等组成。多谐振荡器由晶体管或集成电路构成&#xff0c;当接通电源后&#xff08;1.5~15V 直流工 作电压&#xff09;&#xff0c;多谐振荡…

c++ day 6

1、 将之前定义的栈类和队列类都实现成模板类 #include <iostream>using namespace std;#define MAX 128template<typename T>class Stack { public://构造函数Stack();//析构函数~Stack();//拷贝构造函数Stack(const Stack &other);//入栈int push(T e);//出…

​LeetCode解法汇总1222. 可以攻击国王的皇后

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 在一个 8x…

Linux学习笔记-Ubuntu系统下配置用户ssh只能访问git仓库

目录 一、基本信息1.1 系统信息1.2 git版本[^1]1.2.1 服务器端git版本1.2.2 客户端TortoiseGit版本1.2.3 客户端Git for windows版本 二、创建git用户和群组[^2]2.1 使用groupadd创建群组2.2 创建git用户2.2.1 使用useradd创建git用户2.2.2 配置新建的git用户ssh免密访问 2.3 创…

AndroidStudio 编译输出中文乱码

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言现象如何解决 前言 Android studio 编译输出乱码 现象 如何解决 在弹出的 studio64.exe.vmoptions 文件中 , 输入如下内容 : -Dfile.encodingUTF-8上述文件配…

基于小程序的理发店预约系统

一、项目背景及简介 现在很多的地方都在使用计算机开发的各种管理系统来提高工作的效率&#xff0c;给人们带来很多的方便。计算机技术从很大的程度上解放了人们的双手&#xff0c;并扩大了人们的活动范围&#xff0c;是人们足不出户就可以通过电脑进行各种事情的管理。信息系…

真空腔体的设计要点

真空腔体是保持内部为真空状态的容器&#xff0c;真空腔体设计制作要考虑容积、材质和形状。 1、根据应用需求选择腔体形状。几种代表性的真空腔体包括垂直真空腔体、水平真空腔体、立方真空腔体和球形真空腔体。 2、根据获得真空度选择腔体材质。钛用于极高真空&#xff1b;…

qt 移植到vs后,常见问题汇总????

1.第一次在VS中编译QT项目&#xff0c;因为在MinGW中不能编译带有qtwebengine的程序&#xff0c;因为这个引擎使用的google浏览器的内核&#xff0c;据QT官方的说法&#xff1a;google不喜欢MinGW,所以QT5.5以后的版本中带有这个模块的的部分将无法编译通过&#xff0c;我们只能…

2023年五一杯数学建模A题无人机定点投放问题求解全过程论文及程序

2023年五一杯数学建模 A题 无人机定点投放问题 原题再现&#xff1a; 随着科学技术的不断发展&#xff0c;无人机在许多领域都有着广泛的应用。对于空中执行定点投放任务的无人机&#xff0c;其投放精度不仅依赖于无人机的操作技术&#xff0c;而且还与无人机执行任务时所处状…

【C++】匿名对象 ① ( 匿名对象引入 | 匿名对象简介 | 匿名对象概念 | 匿名对象作用域 - 对象创建与销毁 )

文章目录 一、匿名对象引入二、匿名对象简介1、匿名对象概念2、匿名对象作用域 - 对象创建与销毁3、代码示例 - 创建并使用匿名对象 一、匿名对象引入 匿名对象引入 : 在上一篇博客 【C】拷贝构造函数调用时机 ② ( 对象值作为函数参数 | 对象值作为函数返回值 ) 中 , 讲到了 如…