day 57 算法训练|动态规划part17

news2024/9/24 15:19:02

参考:代码随想录

647. 回文子串

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

是不是能找到一种递归关系,也就是判断一个子字符串(字符串的下表范围[i,j])是否回文,依赖于,子字符串(下表范围[i + 1, j - 1])) 是否是回文

布尔类型的dp[i][j]:表示区间范围[i,j] (注意是左闭右闭)的子串是否是回文子串,如果是dp[i][j]为true,否则为false。

dp数组无法直接得出回文数量,但是可以判断是否为回文,如果是,直接增加即可

2. 递推公式

整体上是两种,就是s[i]与s[j]相等,s[i]与s[j]不相等这两种。

当s[i]与s[j]不相等,那没啥好说的了,dp[i][j]一定是false。

当s[i]与s[j]相等时,这就复杂一些了,有如下三种情况

  • 情况一:下标i 与 j相同,同一个字符例如a,当然是回文子串
  • 情况二:下标i 与 j相差为1,例如aa,也是回文子串
  • 情况三:下标:i 与 j相差大于1的时候,例如cabac,此时s[i]与s[j]已经相同了,我们看i到j区间是不是回文子串就看aba是不是回文就可以了,那么aba的区间就是 i+1 与 j-1区间,这个区间是不是回文就看dp[i + 1][j - 1]是否为true。

其实情况12,就包含了初始化,预防了可能存在的边界溢出

3.初始化

由于已经有情况12考虑初始化的情况,所以dp数组初始值就是默认值false

4. 遍历顺序

根据递推公式可以知道

情况三是根据dp[i + 1][j - 1]是否为true,在对dp[i][j]进行赋值true的。

dp[i + 1][j - 1] 在 dp[i][j]的左下角,如图:

647.回文子串

所以一定要从下到上,从左到右遍历,这样保证dp[i + 1][j - 1]都是经过计算的

class Solution {
    public int countSubstrings(String s) {
        char[] chars = s.toCharArray();
        int len = chars.length;
        boolean[][] dp = new boolean[len][len];
        int result = 0;
        for (int i = len - 1; i >= 0; i--) {
            for (int j = i; j < len; j++) {
                if (chars[i] == chars[j]) {
                    if (j - i <= 1) { // 情况一 和 情况二
                        result++;
                        dp[i][j] = true;
                    } else if (dp[i + 1][j - 1]) { //情况三
                        result++;
                        dp[i][j] = true;
                    }
                }
            }
        }
        return result;
    }
}

简化版

class Solution {
    public int countSubstrings(String s) {
        boolean[][] dp = new boolean[s.length()][s.length()];
        
        int res = 0;
        for (int i = s.length() - 1; i >= 0; i--) {
            for (int j = i; j < s.length(); j++) {
                if (s.charAt(i) == s.charAt(j) && (j - i <= 1 || dp[i + 1][j - 1])) {
                    res++;
                    dp[i][j] = true;
                }
            }
        }
        return res;
    }
}

双指针法

动态规划的空间复杂度是偏高的,我们再看一下双指针法。

首先确定回文串,就是找中心然后向两边扩散看是不是对称的就可以了。

在遍历中心点的时候,要注意中心点有两种情况

一个元素可以作为中心点,两个元素也可以作为中心点。

516.最长回文子序列

回文子串是要连续的,回文子序列可不是连续的!

递推公式:

这个递推公式适用于求最大值,的max,而不是多少种方法的累加

如果s[i]与s[j]相同,那么dp[i][j] = dp[i + 1][j - 1] + 2;

如图: 

516.最长回文子序列

(如果这里看不懂,回忆一下dp[i][j]的定义)

如果s[i]与s[j]不相同,说明s[i]和s[j]的同时加入 并不能增加[i,j]区间回文子序列的长度,那么分别加入s[i]、s[j]看看哪一个可以组成最长的回文子序列。

加入s[j]的回文子序列长度为dp[i + 1][j]。

加入s[i]的回文子序列长度为dp[i][j - 1]。

那么dp[i][j]一定是取最大的,即:dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);

动态规划总结

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

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

相关文章

速欣商务咨询:江西信用卡逾期问题解决专家,为您排忧解难

信用卡逾期问题常常令人困扰&#xff0c;对个人信用造成负面影响。江西速欣商务咨询以其专业服务团队&#xff0c;成为解决江西地区信用卡逾期问题的专家&#xff0c;为您提供全方位的解决方案&#xff0c;排忧解难。 深度诊断&#xff0c;制定个性化解决方案 速欣商务咨询通过…

ASP.NET Core基础之图片文件(一)-WebApi图片文件上传到文件夹

阅读本文你的收获&#xff1a; 了解WebApi项目保存上传图片的三种方式学习在WebApi项目中如何上传图片到指定文件夹中 在ASP.NET Core基础之图片文件(一)-WebApi访问静态图片文章中&#xff0c;学习了如何获取WebApi中的静态图片&#xff0c;本文继续分享如何上传图片。 那么…

基于花授粉算法优化的Elman神经网络数据预测 - 附代码

基于花授粉算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于花授粉算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于花授粉优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&#x…

李沐机器学习系列3---深度学习计算

1 层和块 1.1 定义块 用class表示层&#xff0c;并只需要实现构造函数和前向传播函数 class MLP(nn.Module):# 用模型参数声明层。这里&#xff0c;我们声明两个全连接的层def __init__(self):# 调用MLP的父类Module的构造函数来执行必要的初始化。# 这样&#xff0c;在类实…

C++面向对象语法总结(三)

目录 《C面向对象语法总结(一&#xff09;》《C面向对象语法总结(二&#xff09;》 二十一、多继承 C允许一个类可以有多个父类&#xff08;不建议使用&#xff0c;会增加程序设计复杂度&#xff09;在多继承中&#xff0c;会按照继承顺序将父类的成员变量放到子类成员变量的…

qt .pro工程转vs工程

1. 新建vs空项目或者Qt Console Application&#xff1b; 2. 扩展 -》Qt VS Tools -》Open Qt Project (.pro) 打开对应的pro文件即可将.pro工程转成vs工程&#xff1b; 注意&#xff1a; &#xff08;1&#xff09;转成的vs工程在pro文件同级目录下&#xff0c;双击打开vcx…

完善 Golang Gin 框架的静态中间件:Gin-Static

Gin 是 Golang 生态中目前最受用户欢迎和关注的 Web 框架&#xff0c;但是生态中的 Static 中间件使用起来却一直很不顺手。 所以&#xff0c;我顺手改了它&#xff0c;然后把这个改良版开源了。 写在前面 Gin-static 的改良版&#xff0c;我开源在了 soulteary/gin-static&a…

第二十五章 JDBC 和数据库连接池

一、JDBC 概述&#xff08;P821&#xff09; 1. 基本介绍 &#xff08;1&#xff09;JDBC 为访问不同的数据库提供了统一的接口&#xff0c;为使用者屏蔽了细节问题。 &#xff08;2&#xff09;Java 程序员使用 JDBC&#xff0c;可以连接任何提供了 JDBC 驱动程序的数据库系统…

【网络技术】【Kali Linux】Wireshark嗅探(六)地址解析协议(ARP)

一、实验目的 本次实验使用Wireshark流量分析工具进行网络嗅探&#xff0c;旨在了解地址解析协议&#xff08;ARP&#xff09;的工作原理。 二、ARP协议概述 地址解析协议&#xff08;Address Resolution Protocol, ARP&#xff09;位于网络层&#xff08;IP层&#xff09;&…

金和OA SAP_B1Config.aspx存在未授权访问漏洞

产品简介 金和网络是专业信息化服务商&#xff0c;为城市监管部门提供了互联网监管解决方案&#xff0c;为企事业单位提供组织协同OA系统升开发平台&#xff0c;电子政务一体化平台智慧电商平合等服务 漏洞概述 金和OA SAP_B1Config.aspx存在未授权访问漏洞&#xff0c;攻击…

看完,你还会学鸿蒙吗?

是不是前端程序员的春天&#xff0c;我们可以分析鸿蒙现在的市场和布局。其实不仅仅只是前端&#xff0c;还有Android、Java、Python等等开发人员都可以把鸿蒙当做新的出路。 2024年程序员为什么一定要学鸿蒙&#xff1f; 首先&#xff0c;鸿蒙作为一个新系统的出现。它的结构…

Android studio BottomNavigationView 应用设计

一、新建Bottom Navigation Activity项目&#xff1a; 二、修改bottom_nav_menu.xml: <itemandroid:id"id/navigation_beijing"android:icon"drawable/ic_beijing_24dp"android:title"string/title_beijing" /><itemandroid:id"i…

test ui-04-testcomplete 入门介绍

About TestComplete TestComplete是一款适用于各种应用程序类型和技术的自动化测试环境&#xff0c;包括&#xff08;但不限于&#xff09;Windows、.NET、WPF、Visual C、Visual Basic、Delphi、CBuilder、Java以及Web应用程序和服务。 TestComplete既适用于功能测试&#x…

线程的深入学习(一)

前言 前面文章讲述了线程的部分基本知识&#xff0c;这篇是对线程的深入学习&#xff0c;包含线程池&#xff0c;实现框架等。 1.学习如何使用Executor框架创建线程池。 2.并发工具类如CountDownLatch、CyclicBarrier等。 3.线程安全和并发集合&#xff1a; 4.学习如何使用Jav…

python入门第一讲:认识python

目录 什么是计算机 什么是编程 编程语言有哪些 python是咋来的 python能干啥 python的优缺点 什么是计算机 什么叫计算机&#xff0c;当你把问这个问题问家里的老人的时候&#xff0c;他们很可能指着计算器告诉你说&#xff0c;这个就是计算机&#xff0c;这个很明显&am…

CEEMDAN +组合预测模型(Transformer - BiLSTM+ ARIMA)

目录 往期精彩内容&#xff1a; 前言 1 风速数据CEEMDAN分解与可视化 1.1 导入数据 1.2 CEEMDAN分解 2 数据集制作与预处理 3 基于CEEMADN的 Transformer - BiLSTM 模型预测 3.1 定义CEEMDAN-Transformer - BiLSTM预测模型 3.2 设置参数&#xff0c;训练模型 4 基于A…

HubSpot电子邮件自动化的关键功能和流程!

HubSpot提供了强大的电子邮件自动化工具&#xff0c;使用户能够创建、执行和跟踪复杂的电子邮件市场营销活动。以下是HubSpot电子邮件自动化的一些关键功能和流程&#xff1a; 1.电子邮件工作流程&#xff08;Email Workflows&#xff09;&#xff1a; 用户可以使用HubSpot的工…

Lumerical Script------for语句

Lumerical------for语句 正文正文 关于 Lumerical 中 for 语句的用法这里不做过多说明了,仅仅做一个记录,具体用法如下: 通常我们用的比较多的形式是第一种步长值为 1 的情况。对于其他步长值的情况,我们可以使用第二种用法。对于 while 的类似使用方法可以使用第三种。 …

2_并发编程同步锁(synchronized)

并发编程带来的安全性同步锁(synchronized) 1.他的背景 当多个线程同时访问&#xff0c;公共共享资源的时候&#xff0c;这时候就会出现线程安全&#xff0c;代码如&#xff1a; public class AtomicDemo {int i0;//排他锁、互斥锁public void incr(){ //synchronizedi; …

Allins 官网正式上线,铭文赛道进入 AMM 交易时代

“Allins 正在通过全新的 AMM 方案为BRC20及多链铭文资产拓展 DeFi 场景&#xff0c;官网的全新上线意味着铭文资产的交易正式进入 AMM 时代。” 在 2023 年 1 月开始&#xff0c; Ordinals 协议的推出成为了铭文赛道发展的开端&#xff0c;并为比特币这类非图灵完备的生态&…