LeetCode刷题之HOT100之最长回文串

news2024/11/16 7:38:38

2024/5/28 大家上午好啊,我又来做题了

1、题目描述

在这里插入图片描述

2、逻辑分析

题目要求找出最长的回文子串。我回去看了一下回文数字和回文链表这两道题。这个题目的思想其实跟以上两题也差不多,但是结合了最长子串这一概念。那么怎么解决这个题目呢?那么我给出的建议就是先看题解。官方给出了三种解题方法:动态规划、中心扩展算法和Manacher算法。那么先从第一种方法动态规划开始吧。

动态规划:对于一个子串而言,如果它是回文串,并且长度大于 222,那么将它首尾的两个字母去除之后,它仍然是个回文串。例如对于字符串 “ababa”,如果我们已经知道 “bab” 是回文串,那么 “ababa”一定是回文串,这是因为它的首尾两个字母都是 “a”。那么借助这个算法思想,即可做出解答。

3、代码演示

public String longestPalindrome(String s) {  
    // 获取字符串s的长度  
    int n = s.length();  
    // 创建一个二维布尔数组dp,用于记录从i到j的子串是否为回文串  
    boolean[][] dp = new boolean[n][n];  
  
    // 初始化dp数组  
    // 单个字符一定是回文串  
    for(int i = 0 ; i < n ; i++){  
        dp[i][i] = true;  
        // 如果相邻的两个字符相等,那么它们组成的子串也是回文串  
        if(i + 1 < n) dp[i][i + 1] = (s.charAt(i) == s.charAt(i + 1)); // 这里修正为i+1,而不是i+1][i  
    }   
    // 初始化最长回文子串的起始和结束索引  
    int begin = 0, end = 0;  
    // 从长度为2的子串开始检查,直到整个字符串  
    for(int l = 2; l <= n; l++){  
        // 遍历所有可能的子串起始位置  
        for(int i = 0; i < n; i++){  
            // 计算当前子串的结束位置  
            int j = i + l - 1;  
            // 如果结束位置超出了字符串的范围,则跳出当前循环  
            if(j >= n){  
                break;  
            }  
            // 更新dp[i][j]的值,基于两个条件:1. s[i] == s[j];2. 子串s[i+1...j-1]也是回文串  
            dp[i][j] = dp[i + 1][j - 1] && s.charAt(i) == s.charAt(j);  
            // 如果当前子串是回文串,并且它的长度比之前记录的最长回文子串更长,则更新最长回文子串的起始和结束索引  
            if(dp[i][j] && l > end - begin + 1){  
                begin = i;  
                end = j;  
            }  
        }  
    }    
    // 根据记录的起始和结束索引,返回最长回文子串  
    return s.substring(begin, end + 1);  
}

时间复杂度:O(nn),空间复杂度:O(nn)。

后面的两种方法就不看了,BYE

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

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

相关文章

YOLOv8+PyQt5动物检测系统完整资源集合(yolov8模型,从图像、视频和摄像头三种路径识别检测,包含登陆页面、注册页面和检测页面)

1.猫狗猴检测YOLOv8&#xff08;https://mbd.pub/o/bread/mbd-ZpaTl51u&#xff09;_哔哩哔哩_bilibili 资源包含可视化的动物检测系统&#xff0c;基于最新的YOLOv8训练的动物检测模型&#xff0c;和基于PyQt5制作的可视化动物检测系统&#xff0c;包含登陆页面、注册页面和检…

探索智能零售的未来商机与运营策略

探索智能零售的未来商机与运营策略 在智能零售的广阔图景中&#xff0c;无人售货机加盟赫然矗立为一股不可小觑的力量&#xff0c;预示着零售业态未来的转型与机遇。其核心优势多维展开&#xff0c;具体阐述如下&#xff1a; 1. **全天候服务**&#xff1a;无人售货机的运行跨…

后量子密码算法的数学原理

后量子密码算法&#xff0c;作为应对未来量子计算时代挑战的重要技术手段&#xff0c;其研究和应用正在逐步成为信息安全领域的热点。以下是对后量子密码算法的详细阐述&#xff1a; 一、背景与意义 随着量子计算技术的快速发展&#xff0c;传统的公钥密码算法&#xff0c;如RS…

CSS 一些常见的大坝设备仪器标识绘制

文章目录 需求分析1. 坝基测压管2. 坝体测压管3. 竖向位移兼水平位移测点4. 竖向位移测点5. 三角量水堰6. 水平位移观测工作基点7. 竖向位移观测水准基点8. 其他 需求 绘制一些常见的设备仪器标识符 分析 1. 坝基测压管 <!DOCTYPE html> <html lang"en"…

Linux快速定位日志 排查bug技巧和常用命令

1. 快速根据关键字定位错误信息 grep 在 Linux 系统中&#xff0c;可以使用 grep 命令来查找日志文件中包含特定关键字的行。假设你的日志文件路径为 /var/log/myapp.log&#xff0c;你想要查找包含关键字 "abc" 的日志内容&#xff0c;可以按照以下步骤操作&#…

yolox-何为EMA?

何为EMA&#xff1f; 定义&#xff1a; 滑动平均/指数加权平均&#xff1a;用来估计变量的局部均值&#xff0c;使得变量的更新与一段时间内的历史取值有关&#xff0c;滑动平均可以看作是变量的过去一段时间取值的均值。 优点&#xff1a; 相比于直接赋值&#xff0c;滑动平均…

探索数组的最大值与最小值:从基础到进阶

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;数组的奥秘 二、基础操作&#xff1a;查找数组的最大值和最小值 三、…

RK平台ADB不识别问题排查

简介 ADB是Android系统的调试工具&#xff0c;一般用USB线连接开发板和PC&#xff0c;可以抓取开发板的调试日志&#xff0c;执行shell指令&#xff0c;传输文件等功能。为了调试方便&#xff0c;RK平台的Linux系统也默认支持ADB&#xff0c;其源码是从Android移植过来的。 本…

C语言——基于stm32G030的温湿度传感器项目实验

一、功能要求&#xff1a; 设备自检功能&#xff1a; 设备上电自检&#xff08;检查传感器采集是否正常&#xff0c; DHT11有存在响应&#xff0c; 可以自检使用&#xff0c; &#xff09;自检通过后&#xff0c;由串口打印设备状态信息。 自动控制功能&#xff1a; 进入自动控…

汇编原理(二)寄存器——内存访问

一个字 两个字节 双字 字节为8位 字为16位&#xff08;看两格&#xff09; 双子dword32位&#xff08;看四格&#xff09; 内存中字的存储&#xff1a; 0地址单元中存放的字节型数据是多少&#xff1f; 0地址字单元中存放的字型数据是多少&#xff1f; 2地址字单元中存放…

网络之再谈体系结构

大家都知道的是网络的体系结构&#xff0c;现代软件常用的体系结构无非是TCP/IP协议栈&#xff0c;OSI因为实现复杂并且效率没有TCP/IP协议栈好&#xff0c;所以不用OSI&#xff0c;但是&#xff0c;最近在复习网络知识的时候&#xff0c;发现了一些奇怪的地方&#xff0c;那就…

深度学习-序列模型

深度学习-序列模型 1. 定义2. 应用领域3. 典型模型4. 技术细节5. 总结 序列模型是一种处理序列数据的机器学习模型&#xff0c;其输入和/或输出通常为序列形式的数据。以下是关于序列模型的详细解释&#xff1a; 1. 定义 序列模型是输入输出均为序列数据的模型&#xff0c;它…

【Python】 Python中__slots__的妙用与深入解析

基本原理 在Python中&#xff0c;__slots__是一个特殊的类属性&#xff0c;它可以用来限制一个类可以拥有的属性数量。这个特性在Python中非常有用&#xff0c;尤其是在创建大量实例时&#xff0c;可以显著减少内存的使用。 通常&#xff0c;Python的类会为每个实例自动创建一…

linux下docker 的使用(2)

上期我们讲了网络&#xff0c;现在来进行最后的 docker的基础内容 java项目的部署 假如说 我们java 项目已经写好了&#xff0c;现在在maven中打包一下我们的项目&#xff0c;然后会得到一个jar包&#xff0c;把jar包 上传到虚拟机上 点击package 命令&#xff0c;会得到一个…

【ARM+Codesys案例】RK3568 +Codesys 软PLC方案在电镀生产线的应用

1 电镀生产简介 电镀是一种比较重要的工艺&#xff0c;产品经过电镀工艺处理后&#xff0c;不仅产品质量获得提高&#xff0c;产品性能也会大幅度提高&#xff0c;同时延长了产品的使用时间。电镀生产线是指按一定的电镀生产工艺要求,将有关的各种电镀处理槽、电镀行车运动装置…

ip地址更改方法有哪些类型

在互联网世界中&#xff0c;IP地址作为每个网络设备的唯一标识符&#xff0c;其重要性不言而喻。无论是为了提升网络安全、实现远程办公&#xff0c;还是解决地域限制等问题&#xff0c;我们都有可能需要更改IP地址。本文将详细介绍IP地址更改方法有哪些类型&#xff0c;以便在…

Android面试题之Jetpack的三大核心组件

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 ViewModel 和 LiveData 是 Android Jetpack 组件库中的两个核心组件&#xff0c;它们能帮助开发者更有效地管理 UI 相关的数据&#xff0c;并且…

009、字符串_应用场景

缓存功能 Redis作为缓存层&#xff0c;MySQL作 为存储层&#xff0c;绝大部分请求的数据都是从Redis中获取。由于Redis具有支撑高 并发的特性&#xff0c;所以缓存通常能起到加速读写和降低后端压力的作用。 计数 许多应用都会使用Redis作为计数的基础工具&#xff0c;它可…

Pycharm常见问题1

问题&#xff1a; ValueError at /user/users/ The view user.views.get_users didnt return an HttpResponse object. It returned None instead. 问题分析&#xff1a; 视图user.views.get_users未返回HttpResponse对象&#xff0c;它返回值为None。也就是说在视图文件没有…

[JDK工具-10] jvisualvm 多合一故障处理工具

文章目录 1. 介绍2. 查看堆的变化3. 查看堆快照4. 导出堆快照文件5. 查看class对象加载信息6. CPU分析&#xff1a;发现cpu使用率最高的方法7. 查看线程快照&#xff1a;发现死锁问题 1. 介绍 VisualVM 是一款免费的&#xff0c;集成了多个 JDK 命令行工具的可视化工具&#xf…