LeetCode:最长回文子串(动态规划)

news2024/10/7 8:25:47

一、题目

在这里插入图片描述
https://leetcode.cn/problems/longest-palindromic-substring/description/

二、 算法思想

使用动态规划思想解决,如果一个子串是回文的,并且它的左右两边各加上一个字符后仍然是回文的,那么这个子串加上这两个字符后也一定是回文的。因此可以用一个二维数组记录每个子串是否是回文的,然后逐步扩展子串的长度,直到找到最长的回文子串。

假设要判断 s[i…j] 是否是回文的,那么只需要判断 s[i+1…j-1] 是否是回文的,并且 s[i] == s[j],即可判断 s[i…j] 是否是回文的。因此可以用一个二维数组 dp[i][j] 表示 s[i…j] 是否是回文的,如果是回文的,dp[i][j] 的值为 true,否则为 false。初始化时,单个字符肯定是回文的,因此 dp[i][i] 的值都为 true。

然后逐步扩展子串的长度,如果 s[i+1…j-1] 是回文的,并且 s[i] == s[j],那么 s[i…j] 也是回文的,即 dp[i][j] = true。最后找到所有 dp[i][j] 为 true 的子串中长度最长的即可。

C++代码中,使用一个二维数组dp来存储每个子串是否为回文串的状态,其中dp[i][j]表示字符串s从下标i到下标j的子串是否为回文串。初始化时,所有状态都为0。
接下来,枚举所有可能的子串,从长度为1到n,依次计算每个子串是否为回文串,更新dp数组和最长回文子串的长度和起始位置。最后返回最长回文子串即可。

Java 代码实现

class Solution {
    public String longestPalindrome(String s) {
        int n = s.length();
        boolean[][] dp = new boolean[n][n];
        String res = "";

        for (int len = 1; len <= n; len++) {    //len是回文子串长度
            for (int i = 0; i + len - 1 < n; i++) {
                int j = i + len - 1;    //回文子串的右边界
                if (len == 1) {         // 单个字符是回文串
                    dp[i][j] = true;
                } else if (len == 2) {      // 两个字符相等就是回文串
                    dp[i][j] = s.charAt(i) == s.charAt(j);
                } else {        // 状态转移方程
                    dp[i][j] = dp[i+1][j-1] && s.charAt(i) == s.charAt(j);
                }

                if (dp[i][j] && len > res.length()) {   // 更新最长回文子串
                    res = s.substring(i, j+1);
                }
            }
        }
        return res;
    }
}

C++代码实现

class Solution {
public:
string longestPalindrome(string s) {
        int n = s.size();
        //创建一个n*n的二维矩阵(即一个二维向量),其中每个元素是一个整数。
        vector<vector<int>> dp(n, vector<int>(n)); // 初始化为0

        int start = 0, maxLen = 1;
        // 枚举所有可能的子串,从长度为1到n
        for (int len = 1; len <= n; ++len) {
            for (int i = 0; i + len - 1 < n; ++i) {
                int j = i + len - 1; // 子串右端点
                if (len == 1) {
                    dp[i][j] = 1; // 单个字符是回文串
                } else if (len == 2) {
                    dp[i][j] = (s[i] == s[j]); // 两个字符相等就是回文串
                } else {
                    dp[i][j] = (s[i] == s[j] && dp[i+1][j-1]); // 状态转移方程
                }

                if (dp[i][j] && len > maxLen) { // 更新最长回文子串的长度和起始位置
                    start = i;
                    maxLen = len;
                }
            }
        }
        return s.substr(start, maxLen); // 返回最长回文子串
    }
};

三、算法时间空间复杂度分析

Java代码

算法的时间复杂度为 O ( n 2 ) O(n^2) O(n2),其中 n n n 是字符串的长度。这是因为算法中使用了一个二维数组 d p dp dp,该数组的大小为 n × n n \times n n×n,且算法需要填充该数组的所有元素。对于每个元素 ( i , j ) (i,j) (i,j),需要使用 O ( 1 ) O(1) O(1) 的时间计算其值。

算法的空间复杂度也是 O ( n 2 ) O(n^2) O(n2)。这是因为算法中使用了一个二维数组 d p dp dp,该数组的大小为 n × n n \times n n×n。除此之外,算法还使用了一个字符串变量 r e s res res,其长度不超过 n n n。因此,该算法的总空间复杂度为 O ( n 2 ) O(n^2) O(n2)

C++代码

算法的时间复杂度为 O ( n 2 ) O(n^2) O(n2),空间复杂度也为 O ( n 2 ) O(n^2) O(n2)

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

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

相关文章

浅谈 TCP 握手/数据传输/挥手过程以及 tcpdump 抓包工具使用

前言浅谈 OSITCP三次握手数据传输四次挥手Socket 服务端/客户端通信测试服务端代码客户端代码tcpdump 命令监控命令总结FAQ怎么确认数据包的大小&#xff1f;TCP 拥塞如何避免&#xff1f;如何理解 TCP keep-alive 原理?总结前言 在网络知识体系&#xff0c;TCP 这块的三次握…

【计算机组成原理】指令系统

目录 指令格式 按指令数目分类&#xff1a; 零地址指令 一地址指令 二地址指令 三地址指令 四地址指令 按指令长度分类&#xff1a; 指令字长 机器字长 存储字长 按操作码的长度分类 定长操作码 可变长操作码 定长指令字结构可变长操作码------>拓展操作码指令…

女子举重问题

一、问题的描述 问题及要求 1、搜集各个级别世界女子举重比赛的实际数据。分别建立女子举重比赛总成绩的线性模型、幂函数模型、幂函数改进模型&#xff0c;并最终建立总冠军评选模型。 应用以上模型对最近举行的一届奥运会女子举重比赛总成绩进行排名&#xff0c;并对模型及…

Java分布式事务(二)

文章目录&#x1f525;分布式事务处理_认识本地事务&#x1f525;关系型数据库事务基础_并发事务带来的问题&#x1f525;关系型数据库事务基础_MySQL事务隔离级别&#x1f525;MySQL事务隔离级别_模拟异常发生之脏读&#x1f525;MySQL事务隔离级别_模拟异常发生之不可重复读&…

信息安全与数学基础-笔记-②同余

知识目录同余完全剩余系剩余类完全剩余系❀简化剩余系❀欧拉函数逆元&#xff01;欧拉定理 &#xff01;同余 a,b 两个数字&#xff0c;都模m&#xff0c;当两个数字模m后余的数一样即为同余。 例子&#xff1a; a bq r (mod m)&#xff0c;这里的a 和 r 就是同余 &#xff…

如何使用Unity3d实现多人对战联机游戏

所需资源 课程来源&#xff08;请支持正版课程&#xff09; 安装Unity Hub 安装Visual Studio 角色模型 环境准备 ①Unity设置 不设置的话编写有些代码没有自动补全 点开 Preferences 选择 visual studio ②角色导入 点击 windows—>Package Manager 左上角 My Ass…

数据结构与算法(七):排序算法

排序算法是《数据结构与算法》中最基本的算法之一&#xff0c;排序算法可以分为内部和外部排序。 内部排序&#xff1a;数据记录在内存中进行排序。 外部排序&#xff1a;因排序的数据很大&#xff0c;一次不能容纳全部的排序记录&#xff0c;在排序过程中需要访问外存。 常…

xgboost:分割Sparsity-aware Split Finding

Sparsity-aware Split Finding1 在许多现实问题中&#xff0c;输入xxx是稀疏的是很常见的。造成稀疏性的可能原因有很多: 1)数据中存在缺失值&#xff1b; 2)统计中频繁出现零项&#xff1b; 3)特征工程的处理结果&#xff0c;如独热编码。 重要的是使算法意识到数据中的稀…

RocketMQ5.1.0单机安装与启动

RocketMQ单机安装与启动系统要求下载地址安装步骤RocketMq启动NameServer查看是否启动成功启动BrokerProxy查看是否启动成功修改tool.sh测试消息产生消息的消费关闭服务器系统要求 下载地址 官网下载地址 二进制包是已经编译完成后可以直接运行的&#xff0c;源码包是需要编译…

javaWeb核心02-RequestResponse

文章目录Request&Response1&#xff0c;Request和Response的概述2&#xff0c;Request对象2.1 Request继承体系2.2 Request获取请求数据2.2.1 获取请求行数据2.2.2 获取请求头数据2.2.3 获取请求体数据2.2.4 获取请求参数的通用方式基于上述理论&#xff0c;request对象为我…

python:使用 Jupyter notebook(测试 matplotlib 和 opencv)

环境&#xff1a; window1python 3.10.6 参考&#xff1a; https://jupyter.org/https://opencv.org/ 一、创建虚拟环境 这个步骤可以跳过&#xff08;因为笔者不喜欢在全局环境安装任何东西&#xff0c;所以搞一个新环境&#xff09;。 先选中一个目录&#xff1a;D:\jackl…

论文笔记 | Conducting research in marketing with quasi-experiments

这篇论文是Journal of Marketing上的论文&#xff0c;讲了使用准实验来进行论文研究的一些事项。外生性识别的来源、几种准实验方法的注意点还有内生性的解决。 这篇论文对于准实验或者是平常论文的展开有一个非常友善的指导功能&#xff0c;可以阅读~ 摘要&#xff1a;本文旨…

多线程实现的三种方法、线程名称的获取

文章目录多线程实现的三种方法1、通过继承Thread&#xff0c;并重写里面的run()方法2、实现Runnable接口&#xff0c;并重写其中run()方法将runnable类传递给Thread类中3、实现Callable接口&#xff0c;重写其中的call()方法Callable接口时有泛型的&#xff0c;该泛型值call()方…

字符串模式匹配,经典KMP算法你还不会?我可不允许你不会!

文章目录重点1. 简单模式匹配算法2. 部分匹配值PM的算法&#xff08;Move j-1 PM[j-1]&#xff09;3. 部分匹配值PM的两次改进&#xff08;Move j-next[j]&#xff09;4. 快速得到next数组5. KMP匹配算法重点 童鞋们看网上讲解的时候一定要分清楚序列是从0开始还是从1开始&…

大数据框架之Hive:第1章 Hive入门

1.1 什么是Hive 1&#xff09;Hive简介 Hive是由Facebook开源&#xff0c;基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张表&#xff0c;并提供类SQL查询功能。 那为什么会有Hive呢&#xff1f;它是为了解决什么问题而诞生的呢&#xff1f; 下…

性能优化|记一次线上OOM问题处理

概述最近线上监控发现 OOM 涨幅较大&#xff0c;因此去尝试定位和修复这个问题&#xff0c;在修复了一些内存泄漏和大对象占用问题后, OOM 依旧未达到正常标准&#xff0c;在这些新上报的 hprof 文件中&#xff0c;发现几乎所有 case 中都有个叫 FinalizerReference 的对象&…

集合体系概述以及Collection集合常用API

一. 集合 集合与数组类似&#xff0c;都是一种容器。集合是Java中存储对象数据的一种容器。集合也被称为对象容器。 数组的特点 集合的特点 集合的大小不固定&#xff0c;启动后可以动态变化&#xff0c;类型也可以选择不固定。集合更像气球&#xff0c;可大可小。集合非常适合…

python与pycharm从零安装

python&#xff08;解释器&#xff09;下载地址&#xff1a;Welcome to Python.orgpycharm&#xff08;编译器&#xff09;下载地址&#xff1a;PyCharm: the Python IDE for Professional Developers by JetBrains一、python的下载与安装到官网后根据步骤下载安装包后&#xf…

xgboost:分割查找:Weighted Quantile Sketch

Weighted Quantile Sketch 专门处理流式和分布式加权数据集的一种分桶的方法 近似算法的一个重要步骤是提出候选分裂点。通常使用特征的百分位数来使候选数据均匀分布。形式上&#xff0c;设Dk(x1k,h1)&#xff0c;(x2k,h2)⋅⋅⋅(xnk,hn)D_k {(x_{1k}, h_1)&#xff0c;(x_…

Redis持久化:RDB、AOF

Redis持久化一. RDB(1) save(2) bgsave(3) 总结二. AOF(1) 重写优化(2) RDB和AOF的区别引入&#xff1a;Redis用内存存储数据&#xff0c;有数据丢失的问题&#xff1b; 一. RDB RDB&#xff08;Redis Database Bcakup file&#xff09;即Redis数据备份文件&#xff0c;或Red…