LeetCode 打卡day57--动态规划之回文串问题

news2024/12/23 12:52:23

一个人的朝圣 — LeetCode打卡第57天

  • 知识总结
  • Leetcode 647. 回文子串
    • 题目说明
    • 代码说明
  • Leetcode 5. 最长回文子串
    • 题目说明
    • 代码说明
  • Leetcode 516. 最长回文子序列
    • 题目说明
    • 代码说明


知识总结

今天是动态规划的回文串问题系列


Leetcode 647. 回文子串

题目链接

题目说明

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

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

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

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

在这里插入图片描述

代码说明

dp数组的含义: dp[i][j] 代表s[i:j]是否为回文串, 左闭右闭
递推公式: 当s[i] == s[j] 时, 分两种情况

  1. j - i <= 1, 如 “aa” 或者 “a” 则一定为回文串
  2. j - 1 > 1. dp[i][j] = dp[i+1][j-1]
    因为我们需要先知道i+1, 才能确定i , 所有i需要倒序遍历
class Solution {
    public int countSubstrings(String s) {
        int len = s.length();
        int result = 0;
        boolean[][] dp = new boolean[len][len];
        //dp[i][j] 代表s[i:j]是否为回文串, 左闭右闭
        for(int i = len -1; i >= 0; i--){
            for(int j = i; j < len; j++){
                if(s.charAt(i) == s.charAt(j)){
                    if(j - i <= 1){
                        dp[i][j] = true;
                        result++;
                    }else if(dp[i+1][j-1]){
                        dp[i][j] = true;
                        result++;
                    }
                }
                
            }
        }

        // for(int i = 0; i < len; i++){
        //     System.out.println(Arrays.toString(dp[i]));
        // }
        return result;
    }
}

Leetcode 5. 最长回文子串

题目链接

题目说明

给你一个字符串 s,找到 s 中最长的回文子串。

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

在这里插入图片描述

代码说明

一样的思路, 但是需要判断用boolean数组来判断s[i:j]是否为回文串, 算最长长度的时候需要记录的是i和当前最长长度

class Solution {
    public String longestPalindrome(String s) {
        int len = s.length();
        int start = 0, end = 0;
        boolean[][] dp = new boolean[len][len];
        int curMax = 1;
    // dp[i][j] 记录了s[i][j]是否为回文串
        for(int i = 0; i < len; i++){
            dp[i][i] = true;
        }

        for(int i = len -1; i >= 0; i--){
            for(int j = i; j< len; j++){
                if(s.charAt(i) == s.charAt(j)){
                    if(j - i <= 1){
                        dp[i][j] = true;
                    }else{
                        dp[i][j] = dp[i+1][j-1];
                    }
                }

                if(dp[i][j] && j - i + 1> curMax){
                    curMax = j -i + 1;
                    start = i;
                }
            }
        }
        // for(int i = 0; i < len; i++){
        //     System.out.println(Arrays.toString(dp[i]));
        // }
        return s.substring(start, start + curMax);
    }
}

Leetcode 516. 最长回文子序列

题目链接

题目说明

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

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

代码说明

回文序列和回文子序列还是有区别, 主要体现在处理s[i] != s[j] 上.

class Solution {
    public int longestPalindromeSubseq(String s) {
        int len = s.length();
        int[][] dp = new int[len][len];
        //dp[i][j] represent the longest palindrome lenght in s[i:j] (j>= i)
        for(int i = len -1; i>= 0; i--){
            for(int j = i; j< len; j++){
                if(s.charAt(i) == s.charAt(j)){
                    if(j - i <= 1){
                        dp[i][j] = j -i +1;
                    }else{
                        dp[i][j] = dp[i+1][j-1] + 2;
                    }
                }else{
                    dp[i][j] = Math.max(dp[i+1][j], dp[i][j-1]);
                }
            }
        }
        
        // for(int i = 0; i < len; i++){
        //     System.out.println(Arrays.toString(dp[i]));
        // }
        return dp[0][len-1];
    }
}

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

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

相关文章

nginx四层转发应用

默认使用yum安装的nginx是没有额外安装的动态模块的&#xff0c;需要自己额外安装 ls /usr/lib64/nginx/modules/ 若是不安装stream模块&#xff0c;直接在nginx的配置文件中调用stream模块&#xff0c;重载配置文件的时候会报错识别不到stream功能 安装stream模块 yum insta…

网际奇缘:计算机网络演进、概念探秘与通信魔法!

文章目录 计算机网络概述1.1&#x1f341;&#x1f341;计算机网络的基本定义和基本功能1.2 &#x1fab6;&#x1fab6;计算机网络的演进过程1.2.1 &#x1f987;主机互联&#x1f987;1.2.2 &#x1f987;局域网&#x1f987;1.2.3 &#x1f987;互联网&#x1f987;1.2.4 &a…

测试编排必要性

目录 前言&#xff1a; 测试编排定义 测试编排和自动化 测试编排的好处 自动化的测试编排策略 自动化/编排工具 测试编排和CI/CD 学点啥 前言&#xff1a; 编排是一种组织和安排信息的过程&#xff0c;它在各种情境中都是非常重要的。在撰写文章、演讲或其他形式的表达…

学校公寓管理系统/基于微信小程序的学校公寓管理系统

摘 要 社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个学生的使用。手机具有便利性&#xff0c;速度快&#xff0c;效率高&#xff0c;成本低等优点。 因此&#xff0c;构建符合自己要求的操作…

常用特殊函数的计算机处理

常用特殊函数的计算机处理 gamma 函数 契贝谢夫多项式 契贝谢夫多项式的展开系数 ja_j^{(10)}ja_j^{(10)}01.060.010973695810.42278433707-0.002466748020.411840251880.001539768130.08157821889-0.000344234240.0742379076100.00006771065-0.0002109075 Fortran 实现&…

【雕爷学编程】Arduino动手做(136)---0.91寸OLED液晶屏模块5

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

antd——a-tree组件拖拽节点功能——技能提升

之前写过一篇文章关于&#xff1a; antd——使用a-tree组件实现 检索自动展开自定义增删改查功能——技能提升&#xff1a;http://t.csdn.cn/13qT7 现在有个需求&#xff1a;就是要实现节点的拖拽功能。 tree组件节点的拖拽功能实现 tree组件是有拖拽功能的&#xff0c;通过…

flink-conf.yaml的参数

参数 ⚫jobmanager.memory.process.size&#xff1a;对 JobManager 进程可使用到的全部内存进行配置&#xff0c; 包括 JVM元空间和其他开销&#xff0c;默认为 1600M&#xff0c;可以根据集群规模进行适当调整。⚫ taskmanager.memory.process.size&#xff1a;对 TaskManage…

线性代数中基向量变换参照原理

经常需要用到&#xff0c;又记不住&#xff0c;所以这里记录下来方便以后翻阅。 很重要。 截图出自书为&#xff1a;

Spring Boot 中的 MyBatis 是什么,如何使用

Spring Boot 中的 MyBatis 是什么&#xff0c;如何使用 简介 MyBatis 是一种流行的 Java 持久化框架&#xff0c;可以将 SQL 查询映射到对象上&#xff0c;并提供了简单易用的 API 来执行 CRUD 操作。Spring Boot 可以与 MyBatis 集成&#xff0c;提供了简化配置和自动化配置…

基于单片机的智能台灯 灯光控制系统人体感应楼梯灯系统的设计与实现

功能介绍 以STM32单片机作为主控系统&#xff1b;主通过光敏采集当前光线强度&#xff1b;通过PMW灯光调节电路&#xff0c;我们可以根据不同的光线亮度&#xff0c;进行3挡调节&#xff1b;通过人体红外检测当前是否有人&#xff1b;通过不同光线情况下使用PWM脉冲电路进行调节…

Apifox 已上架至 TitanIDE

Apifox 目前已上架至 TitanIDE 模板&#xff0c;为 TitanIDE 用户提供快速使用接口调试工具的入口。 可以通过 TitanIDE 的「创建项目」快速新建 Apifox 模版&#xff0c;开箱即用。TitanIDE 的模板包括开发者常用的 IDE 及周边开发工具&#xff0c;如数据建模用的 PDmaner、数…

【STM32】GPIO

一、GPIO简介 1. 基本介绍 GPIO是通用输入输出端口的简称&#xff0c;STM32芯片通过GPIO与外设连接&#xff0c;从而实现与外设的数据收发。 最基本的输出功能是由STM32控制引脚输出高、低电平&#xff0c;实现开关控制。如把GPIO引脚接入到LED灯控制LED亮灭&#xff0c;或者…

中小企业的必然选择——构建高效、安全的企业网络

在当今技术驱动的商业环境中&#xff0c;可靠且高效的企业网络对中小型企业的成功是至关重要的。随着对数据密集型应用的需求不断增加&#xff0c;无线网络技术随之迅速发展&#xff0c;企业必须构建一个更快、更安全的网络以保证业务安全稳定开展。本文重点讲解中小型企业网络…

常用stream方法记录

目录 过滤filter()获取最大最小值根据条件统计数量list转mapkey值唯一key值不唯一 distinct去重groupingBy分组map遍历取list中某元素组成新的listlist转数组String基本数据类型数组转换 数组转listArrays.asList(&#xff09;Collections.addAll基本数据类型数组转list 源码和…

阿里云绑定域名

在阿里云安全组与宝塔安全放开8081端口 server {listen 8081;server_name www.whxyyds.top;charset utf-8;location / {root /home/ruoyi/projects/ruoyi-ui;try_files $uri $uri/ /index.html;index index.html index.htm;}location /prod-api/ {proxy_set_header …

途乐证券|A股自动驾驶概念“夏日躁动”

进入7月以后&#xff0c;A股智能汽车产业链——尤其是自动驾驶板块&#xff0c;开始逐渐收复去年失地。 香港途乐证券有限公司&#xff08;191883.com&#xff09;是香港最优秀的股票投资平台&#xff0c;平台致力于为投资者提供专业、安全、诚信的股票策略服务&#xff0c;通过…

微信内置h5浏览器 getBrandWCPayRequest支付

目录 getBrandWCPayRequest支付 什么是getBrandWCPayRequest支付&#xff1f; 如何使用getBrandWCPayRequest支付&#xff1f; getBrandWCPayRequest支付的特点和优势 结论 WeixinJSBridge&#xff1a;微信浏览器的JavaScript桥接工具 WeixinJSBridge的作用 WeixinJSBri…

【震惊】Top1清华考研985考研专业课惨遭团灭!

原谅我今天用了个“UC的标题”&#xff0c;只是他真的太令我震惊了&#xff01;&#xff08;请本次事件受影响者&#xff0c;务必看到最后&#xff0c;我会给出我的建议&#xff09; 事情的起因这样的&#xff1a;这周二有同学发我一条通知&#xff0c;清华大学通信考研考试科…

关于DBC文件的创建增加几点补充

上一节说了&#xff1a;DBC文件的简介与创建 这一节补充几点&#xff1a;关于DBC文件的创建增加几点补充 关于节点地址的定义和修改 有些朋友发现新建某个节点的时候&#xff0c;address栏的内容是灰色的&#xff0c;无法进行定义和修改 这个数值的更改不是在这里进行设置的…