LeetCode刷题 | 647. 回文子串、516. 最长回文子序列

news2024/11/18 10:52:47

647. 回文子串

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

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

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

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

示例 1:

输入:s = "abc"

输出:3

解释:三个回文子串: "a", "b", "c"

示例 2:

输入:s = "aaa"

输出:6

解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"

动归五部曲:

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

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

2. 递推公式

当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。
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;
    }
}

3. dp数组初始化

dp[i][j]初始化为false

4. 确定遍历顺序

从上到下,从左到右遍历

5. 举例推导dp数组

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;i >= 0;i --){
            for(int j = i;j < len;j ++){
                if(s.charAt(i) == s.charAt(j)){
                    if(i == j || j - i == 1){
                        result ++;
                        dp[i][j] = true;
                    }else if(dp[i + 1][j - 1]){
                        result ++;
                        dp[i][j] = true;
                    }
                }
            }
        }
        return result;
    }
}

516. 最长回文子序列

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

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

示例 1:

输入:s = "bbbab"

输出:4

解释:一个可能的最长回文子序列为 "bbbb" 。

示例 2:

输入:s = "cbbd"

输出:2

解释:一个可能的最长回文子序列为 "bb" 。

 动归五部曲:

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

dp[i][j]:字符串s在[i, j]范围内最长的回文子序列的长度为dp[i][j]

2. 递推公式

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

如果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]);

3. dp数组初始化

当i与j相同,那么dp[i][j]一定是等于1的,即:一个字符的回文子序列长度就是1。

其他情况dp[i][j]初始为0

4. 确定遍历顺序

从上往下,从左往右

5. 举例推导dp数组

public class Solution {
    public int longestPalindromeSubseq(String s) {
        int len = s.length();
        int[][] dp = new int[len + 1][len + 1];
        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], Math.max(dp[i][j], dp[i][j - 1]));
                }
            }
        }
        return dp[0][len - 1];
    }
}

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

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

相关文章

ModaHub魔搭社区:清华开源ChatGLM语言模型一键部署教程

目录 ChatGLM是什么 傻瓜式安装部署 一.下载 二、解压 ChatGLM懒人安装包 ChatGLM是什么 ChatGLM和ChatGPT类似&#xff0c;是由清华大学开发的开源大型语言模型。由于它是开源的&#xff0c;所以带来了很多的可能性&#xff0c;比如可以像Ai绘画一样自己微调模型。 目前…

老板说,给我把这个 JS React 项目迁移到 TypeScript

在我们日益发展的网络开发领域中&#xff0c;JavaScript 长期以来一直是首选的语言。它的多功能性和普及性推动了许多应用和网站取得成功。然而&#xff0c;随着项目规模和复杂性的增长&#xff0c;维护 JavaScript 代码库可能变得具有挑战性、容易出错且难以扩展。 走出来的第…

5-Spring cloud之Feign的使用——服务器上实操

5-Spring cloud之Feign的使用——服务器上实操 1. 前言2. 搭建Feign2.1 添加子模块——dog-api2.1.1 子模块结构2.1.2 pom文件2.1.3 核心接口DogClientApi 2.2 添加子模块——dog-consumer-feign-802.2.1 子模块结构2.2.2 pom文件2.2.3 yml文件2.2.4 主启动类2.2.5 controller …

Linux里git的使用

git的使用 一.前置要求1.git的安装2.注册Gitee并创建仓库 二.git三板斧 一.前置要求 1.git的安装 2.注册Gitee并创建仓库 然后记住下面的网址。 之后将仓库克隆到云服务器里。记得输入gitee的账号和密码。 查看目录&#xff0c;可以发现仓库已经在目录里了。 进入目录&#xf…

python毕设课设大作业《火车票分析助手》程序

在PyCharm中运行《火车票分析助手》即可进入如图1所示的系统主界面。 图1 系统主界面 具体的操作步骤如下&#xff1a; &#xff08;1&#xff09;在主界面“车票查询”选项卡中依次输入&#xff0c;出发地、目的地以及出发时间&#xff0c;然后单击“查询”按钮&#xff0c;…

十九、Jenkins版本构建完成,触发自动化测试

十九、Jenkins版本构建完成&#xff0c;触发自动化测试 1.构建后操作-Build other projects 2.关联自动化测试工程 这样版本构建完成&#xff0c;就会执行自动化测试

金九银十跳槽涨薪Java面试题!568页真题+答案解析,大厂都在考

2023年一半又过去了&#xff0c;各大企业的招聘也又开始大量放岗了&#xff0c;各位苟着的小伙伴们要抓住机会了&#xff01; 但很多小伙伴对面试不够了解&#xff0c;不知道如何准备&#xff0c;对面试环节的设置以及目的不了解&#xff0c;尤其是面试题还很难&#xff0c;有些…

RocketMQ5.0--事务消息

RocketMQ5.0–事务消息 一、事务消息概览 RocketMQ事务消息的实现原理基于两阶段提交和定时事务状态回查来决定消息最终是提交还是回滚&#xff0c;消费者可以消费事务提交的消息&#xff0c;如下图所示。事务消息的作用&#xff1a;确保本地业务与消息在一个事务内&#xff0…

成功解决:java file outside of source root

前言 我复制一个很小项目的代码&#xff0c;然后重新命名后。用IDEA打开&#xff0c;发现.java文件的左下方有个橘色的标志。 1、问题文件 这里显示 Java file outside of source root。 查阅资料发现&#xff1a;这个问题是指Java文件不在源代码根目录之内。这可能会导致…

使用pytest命令行实现环境切换

目录 前言 pytest_addoption(parser, pluginmanager) 在conftest.py文件中定义命令行参数 获取命令行参数 设置不同环境的全局变量 定义测试类及测试方法 测试验证 前言 在自动化测试过程中经常需要在不同的环境下进行测试验证&#xff0c;所以写自动化测试代码时需要考…

Android12之IBinder中[[clang::lto_visibility_public]]作用(一百六十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

MySQL自治平台建设的内核原理及实践(上)

总第565篇 2023年 第017篇 本文整理自美团技术沙龙第75期的主题分享《美团数据库攻防演练建设实践》&#xff0c;系超大规模数据库集群保稳系列&#xff08;内含4个议题的PPT及视频&#xff09;的第4篇文章。 本文作者在演讲后根据同学们的反馈&#xff0c;补充了很多技术细节&…

如何绘制「UML类图」

一、UML类图简介 类图以反映类的结构(属性、操作)以及类之间的关系为主要目的&#xff0c;描述了软件系统的结构&#xff0c;是一种静态建模方法。类图用来描述系统中有意义的概念&#xff0c;包括具体的概念、抽象的概念、实现方面的概念等&#xff0c;是对现实世界中事物的抽…

设计模式--------结构型模式

结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式&#xff0c;前者采用继承机制来组织接口和类&#xff0c;后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低&#xff0c;满足“合成复用原则”…

web 页面布局:(三)position 坐标系布局

web 页面布局&#xff1a;&#xff08;三&#xff09;position 坐标系布局 页面坐标系position 设置fixedrelativeabsolutesticky 应用场景 页面坐标系 因为所有文本内容&#xff0c;是从左向右读&#xff0c;自上而下读&#xff0c;和书写习惯&#xff0c;读书习惯一致&#…

惊呆了!这个银行管理技巧也太厉害了吧

在金融行业&#xff0c;蓄电池监控是一项至关重要的任务。随着金融机构的数字化转型和依赖电力的增加&#xff0c;蓄电池成为保障金融系统正常运行的关键组成部分。 因此&#xff0c;对蓄电池的状态进行监控和维护&#xff0c;确保其高效可靠地工作&#xff0c;对金融行业的稳定…

深度学习06-pytorch从入门到精通

文章目录 概述环境准备安装cuda和cudnn安装pytorch 基础张量定义numpy转换数学函数随机数计算函数矩阵处理函数 自动梯度案例计算图 torchvision模块TransformsDataSetDataLoader自定义数据集 nn模块nn.ModuleCNN图像处理层nn.Conv2dnn.AvgPool2d和nn.MaxPool2dnn.Linearnn.Bat…

TransFuse

方法 Transformer分支 将不同尺度的特征图 t 0 、 t 1 和 t 2 t^0、t^1和t^2 t0、t1和t2保存起来&#xff0c;之后与对应的CNN分支的特征图融合。 CNN分支 以基于ResNet的模型为例&#xff0c;模型通常有五个块&#xff0c;每个块对特征图进行两倍下采样。我们获取第 4( g 0…

vue父组件调用子组件的Form表单校验

需求1&#xff1a;父组件调用子组件的表单验证方法&#xff0c;验证成功&#xff0c;继续进行接下来的操作&#xff0c;验证失败&#xff0c;提示用户并返回。 需求2&#xff1a;父组件校验多个子组件的表单验证方法&#xff0c;验证成功&#xff0c;继续进行接下来的操作&…

cookie/session/token(持续更新)

1.cookie 1.1概念 cookie是服务器产生的保存在客户端的一小段文本信息,格式是字典形式,键值对形式 cookie有两类: 1.会话级cookie:保存在内存,随浏览器关闭自动消息 2.持久化cookie:保存在硬盘,浏览器关闭不会直接消失,生命周期取决于失效时间 1.2如何查看cookie以及格式…