动态规划--(回文子串,最长回文子序列)

news2025/2/27 14:02:42

代码随想录day 57 动态规划模块 回文子串,最长回文子序列

文章目录

    • 1.leetcode 647. 回文子串
        • 1.1 详细思路及解题步骤
        • 1.2 Java版代码示例
    • 2.leetcode 516. 最长回文子序列
        • 2.1 详细思路及解题步骤
        • 2.2 Java版代码示例

1.leetcode 647. 回文子串

在这里插入图片描述

1.1 详细思路及解题步骤

  该题用动态规划的思路解题,注意回文子串是原字符串中连续的部分,一个字母的也是回文子串,直接就用动态规划的做题步骤进行分析。

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

这里dp数组的含义一般就是题目需要求的东西
也就是说这题dp[i][j] (Boolean数组)代表的就是s[i,j]左闭右闭的区间中的子串是否为回文子串,是就true,不是就false。

   2. 确定递推公式

  • s[i]与s[j]不相等,就是false
  • s[i]与s[j]相等
     - 且i-j<=1,也就是只有一个或者两个子串,这时dp[i][j]=true;
     - 当i-j>1时候,如果dp[i+1][j-1]=true时,那就可以考虑这个dp[i][j]=true;

  3. dp数组的初始化问题

不需要初始

  4.确定遍历顺序

当i-j>1时候,如果dp[i+1][j-1]=true时,这时候的dp[i][j]是由dp[i+1][j-1]推导出来的,所以i是倒序遍历,j是顺序遍历

  5.推导dp数组
在这里插入图片描述

1.2 Java版代码示例

class Solution {
    public int countSubstrings(String s) {
      if(s.length()==0) return 0;
      boolean[][] dp=new boolean[s.length()][s.length()];
     int result=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)){
                if(j-i<=1){
                result++;
                dp[i][j]=true;
              }else if(dp[i+1][j-1]){
                  result++;
                  dp[i][j]=true;
              }
              }else{
                  dp[i][j]=false;
              }
        //    if(s.charAt(i)==s.charAt(j)&&(j-i<=1||dp[i+1][j-1])){
        //        result++;
        //        dp[i][j]=true;
        //    }else{
        //        dp[i][j]=false;
        //    }
          }
      }
      return result;
    }
}

2.leetcode 516. 最长回文子序列

在这里插入图片描述

2.1 详细思路及解题步骤

  这题跟上题不同的是这题并不是连续的,还是按照动态规划的思路分析。

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

dp[i][j]表示s[i,j]范围内的最长子序列长度

   2. 确定递推公式

  • 当s[i]与是s[j]相等时,dp[i][j]=dp[i-1][j-1]+2
  • 当s[i]与是s[j]不相等时
    - 去掉s[i],dp[i][j]=dp[i+1][j]
    - 去掉s[j],dp[i][j]=dp[i][j-1]

  3. dp数组的初始化问题

dp[i][i]初始为1,其他初始为0

  4.确定遍历顺序

去掉s[i],dp[i][j]=dp[i+1][j],这里确定遍历顺序,i倒序,j顺序

  5.推导dp数组
在这里插入图片描述

2.2 Java版代码示例

public class Solution {
    public int longestPalindromeSubseq(String s) {
        int len = s.length();
        int[][] dp = new int[len][len];
        for (int i = len - 1; i >= 0; i--) { // 从后往前遍历 保证情况不漏
            dp[i][i] = 1; // 初始化
            for (int j = i + 1; j < len; j++) {
                if (s.charAt(i) == s.charAt(j)) {
                    dp[i][j] = dp[i + 1][j - 1] + 2;
                } else {
                    dp[i][j] = Math.max(dp[i + 1][j],dp[i][j - 1]);
                }
            }
        }
        return dp[0][len - 1];
    }
}

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

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

相关文章

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java杨佑川音乐播放器908v6

大部分步骤是 1.确定选题 选题的确定需要查阅大量的资料&#xff0c;要搞清楚自己大概想要研究的方向是什么。可以选择自己感兴趣的学科或者强势的学科进行研究&#xff0c;同时要多和毕业指导老师多交流&#xff0c;征求老师的意见和建议&#xff0c;最后确立选题。计算机专…

【K8S系列】第九讲:Kubernetes 之探针

目录 一、探针是什么 二、探针类型 2.1 livenessProbe 2.1.1 容器重启策略 2.2 readinessProbe 2.3 startupProbe 2.4 总结 2.5 探针示例 2.6 配置字段介绍 三、探测机制 3.1 HTTP GET探针 3.2 TCP套接字探针 3.3 Exec探针 Tips 一、探针是什么 探针:是由 kub…

OpenCV众筹了一款ROS2机器人rae,开源、功能强、上手简单。来瞅瞅~

编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ ▌前言 Hello&#xff0c;大家好&#xff0c;这里是OAK中国&#xff0c;我是助手君。 在2020年、2021年OpenCV分别在Kickstarter上众筹了两款OAK产品&#xff0c;均筹集…

设计模式——桥接模式

桥接&#xff08;Bridge&#xff09;模式 一、基本思想 当一个类内部具备两种或多种变化维度时&#xff0c;使用桥接模式可以解耦这些变化的维度&#xff0c;使高层代码架构稳定。 将抽象与实现分离&#xff0c;使它们可以独立变化。 用组合关系代替继承关系来实现&#xff0…

运维面试必问的中间件高频面试题

1. redis是单线程还是多线程&#xff1f; 这个问题已经被问过很多次了&#xff0c;从redis4.0开始引入多线程&#xff0c;redis 6.0 中&#xff0c;多线程主要用于网络 I/O 阶段&#xff0c;也就是接收命令和写回结果阶段&#xff0c;而在执行命令阶段&#xff0c;还是由单线程…

综述类论文_Machine Learning for Encrypted Malicious Traffic Detection(重要)

文章目录Machine Learning for Encrypted Malicious Traffic Detection: Approaches, Datasets and Comparative Study摘要存在的问题论文贡献1. 基于机器学习的加密流量检测模型的总体框架1.1 Research Target&#xff08;研究目标&#xff09;1.2 Traffic Dataset Collection…

Allegro给各种形式的板框导弧操作指导

Allegro给各种形式的板框导弧操作指导 Allegro可以给板框导弧,让加工出来的板框更加圆滑,具体操作步骤如下 板框是line形式的 选择Manufacture-Drafting-Fillet命令 在Options里面Radius输出导弧的半径,比如78.74 框选两个线段的部分 完成后的效果如下图 框选4个角落,…

Python基础学习

一、Python基础 1.Python介绍 2.发展史 3.Python 2 or 3? 4.安装 5.Hello World程序 6.变量 7.用户输入 8.模块初识 9. .pyc是个什么鬼&#xff1f; 10.数据类型初识 11.数据运算 12.表达式if ...else语句 13.表达式for 循环 14.break and continue 15.表达式while 循环…

最好的Python入门教材是哪本?这本书当之无愧

1.门槛低 适合编程零基础上手 《Python编程 从入门到实践&#xff08;第二版&#xff09;》的作者埃里克马瑟斯&#xff08;Eric Matthes&#xff09;是一名高中科学和数学老师&#xff0c;现居住在阿拉斯加&#xff0c;在当地讲授 Python 入门课程。他从 5 岁开始就一直在编写…

带你深度解析虚幻引擎4的照明和阴影知识

照明是渲染的重要组成部分。有静态光和动态光&#xff0c;它们往往很重并且需要大量计算。今天就让赞奇云工作站带领小伙伴们来学习一下虚幻引擎4中的光照和阴影的知识。 静态照明 静态光在编辑器中预先计算并保存在光照贴图中。 〇&#xff1a;良好的性能和质量&#xff08…

[go学习笔记.第十五章.反射,常量] 1.反射的基本介绍以及实践

一.反射的引入以及基本介绍 1.看两个问题 (1).对于结构体的序列化和反序列化&#xff0c;看一段代码 package mainimport("fmt" "encoding/josn" )type Monster struct {Name string json:"monsterName"Age int json:"monsterAge&quo…

Android商城开发----点击左侧分类列表右侧更新对应列表内容

Android商城开发----点击左侧分类列表右侧更新对应列表内容 目录Android商城开发----点击左侧分类列表右侧更新对应列表内容一、首先说布局&#xff1a;二、主要说一下&#xff0c;布局完成后实现点击左侧类别时&#xff0c;右侧展现对应类的商品列表。主要思想&#xff1a;源代…

Vue3响应系统的实现(二)

前言 继上一篇文章&#xff0c;我们已经能够实现一个简单的响应系统了&#xff0c;但是仍然存在很多缺陷&#xff0c;本篇文章将具体叙述一下存在的缺陷以及如何解决&#xff0c;最后实现一个较为完善的响应式系统 解决副作用函数硬编码问题 从上一篇文章中我们不难发现响应…

概率 | 【提神醒脑】重难点专题突破 自用笔记

本文总结参考于 kira 2023概率提神醒脑技巧班 中 —— 重难点专题。 笔记均为自用整理。加油!ヾ(◍∇◍)ノ゙ 一研为定! 一、条件均匀 / 指数 / 二项…分布 -------------------------------------------------------------------------------------------------------------…

基于inquirer实现一个控制台多级选择交互功能

说在前面 &#x1f388;在前端脚手架工具中经常会看到控制台输入参数等操作。例如Vue-cli中初始化项目会提示选择一些参数等。所以在开发脚手架工具或者node控制台程序&#xff0c;就需要用到inquirer工具或者类似的工具。但是使用过inquirer工具的同学应该知道&#xff0c;目前…

SpringSecurity整合SSM和SpringBoot完成方法级权限控制

初识权限管理 权限管理&#xff0c;一般指根据系统设置的安全规则或者安全策略&#xff0c;用户可以访问而且只能访问自己被授权的资源。权限管理几乎出现在任何系统里面&#xff0c;前提是需要有用户和密码认证的系统。 在权限管理的概念中&#xff0c;有两个非常重要的名词&…

SpringBoot SpringBoot 开发实用篇 1 热部署 1.4 关闭热部署功能

SpringBoot 【黑马程序员SpringBoot2全套视频教程&#xff0c;springboot零基础到项目实战&#xff08;spring boot2完整版&#xff09;】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇1 热部署1.4 关闭热部署功能1.4.1 关闭热部署1.4.2 小结1.4.3 总结1 …

大佬神作!Spring Security从应用到源码,这份手册都讲全了,已三刷

简介 平时我们写 Web 项目&#xff0c;都需要用户登录时验证&#xff0c;以及权限管理之类的操作&#xff0c;以前使用过滤器&#xff0c;拦截器等进行管理&#xff0c;原生代码较多。 所以出现了安全框架以供我们使用&#xff0c;安全框架在 Web 应用的主要功能是&#xff1a…

金九失足,10月喜提“Java高分指南”,11月冲击大厂

蓦然回首自己做开发已经十年了&#xff0c;这十年中我获得了很多&#xff0c;技术能力、培训、出国、大公司的经历&#xff0c;还有很多很好的朋友。但再仔细一想&#xff0c;这十年中我至少浪费了五年时间&#xff0c;这五年可以足够让自己成长为一个优秀的程序员&#xff0c;…

VS2017安装教程(详细版)

1.首先下载好安装包 百度网盘下载链接 链接&#xff1a;https://pan.baidu.com/s/1HW8hrLMazRsBkPvkDHkD1Q?pwdz4jg 提取码&#xff1a;z4jg 2.下载到桌面以管理员身份运行 点击继续 3.进入后更改安装位置&#xff0c;选择安装路径&#xff0c;千万不要安装到C盘 4.改完后…