(动态规划) 5. 最长回文子串 ——【Leetcode每日一题】

news2024/11/8 23:50:43

❓ 5. 最长回文子串

难度:中等

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

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

示例 1:

输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。

示例 2:

输入:s = “cbbd”
输出:“bb”

提示

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

💡思路:

法一:中心点扩展法

首先确定回文串,就是找中心然后想两边扩散看是不是对称的就可以了。

  • 一个元素可以作为中心点;
  • 两个元素也可以作为中心点。

法二:动态规划

定义 dp 数组,dp[i][j] 表示区间范围 [i,j] (注意是左闭右闭)的子串是否是回文子串,如果是 dp[i][j]true,否则为 false

要从下到上,从左到右遍历,当 s[i]s[j] 相等时,有如下三种情况:

  1. 下标 ij 相同,同一个字符例如 a,当然是回文子串
  2. 下标 ij 相差为1,例如 aa,也是文子串
  3. 下标:ij 相差大于1的时候,例如 cabac,此时 s[i]s[j] 已经相同了,我们看 ij 区间是不是回文子串就看 aba 是不是回文就可以了,那么 aba 的区间就是 i+1j-1区间,这个区间是不是回文就看 dp[i + 1][j - 1] 是否为 true

🍁代码:(C++、Java)

法一:中心点扩展法
C++

class Solution {
private:
    int strLen (string s, int l, int r){
        while(l >= 0 && r < s.size()){
            if(s[l] == s[r]){
                l--; 
                r++;
            }
            else break;
        }
        return r - l - 1;
    }
public:
    string longestPalindrome(string s) {
        int mid = 0, len = 0;
        int n = s.size();
        for(int i = 0; i < n; i++){
            int tmp = strLen(s, i - 1, i + 1);
            if(i < n - 1 && s[i] == s[i + 1]) {
                tmp = max(tmp, strLen(s, i - 1, i + 2));
            } 
            if(tmp > len){
                mid = i;
                len = tmp;
            }
        }
        //记录开始点
        int start = mid - len / 2;
        if(len % 2 == 0) start += 1;
        return s.substr(start, len);
    }
};

Java

class Solution {
    private int strLen (String s, int l, int r){
        while(l >= 0 && r < s.length()){
            if(s.charAt(l) == s.charAt(r)){
                l--; 
                r++;
            }
            else break;
        }
        return r - l - 1;
    }
    public String longestPalindrome(String s) {
        int mid = 0, len = 0;
        int n = s.length();
        for(int i = 0; i < n; i++){
            int tmp = strLen(s, i - 1, i + 1);
            if(i < n - 1 && s.charAt(i) == s.charAt(i + 1)) {
                tmp = Math.max(tmp, strLen(s, i - 1, i + 2));
            } 
            if(tmp > len){
                mid = i;
                len = tmp;
            }
        }
        //记录开始点
        int start = mid -len / 2;
        if(len % 2 == 0) start += 1;
        return s.substring(start, start + len);
    }
}

法二:动态规划
C++

class Solution {
public:
    string longestPalindrome(string s) {
        vector<vector<int>> dp(s.size(), vector<int>(s.size(), 0));
        int start = 0;
        int len = 0;
        for(int i = s.size() - 1; i >= 0; i--){
            for(int j = i; j < s.size(); j++){
                if(s[i] == s[j]){
                    if(j - i <= 1 ||dp[i + 1][j - 1]) dp[i][j] = 1;
                }
                if(dp[i][j] && j - i + 1 > len){
                    len = j - i + 1;
                    start = i;
                }
            }
        }
        return s.substr(start, len);
    }
};

Java

class Solution {
    public String longestPalindrome(String s) {
        boolean[][] dp = new boolean[s.length()][s.length()];
        int start = 0;
        int len = 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 ||dp[i + 1][j - 1]) dp[i][j] = true;
                }
                if(dp[i][j] && j - i + 1 > len){
                    len = j - i + 1;
                    start = i;
                }
            }
        }
        return s.substring(start, start + len);
    }
}

🚀 运行结果:

在这里插入图片描述

🕔 复杂度分析:

  • 时间复杂度 O ( n 2 ) O(n^2) O(n2),其中 n 为字符串的长度。
  • 空间复杂度 O ( 1 ) O(1) O(1),法一为 O ( 1 ) O(1) O(1); 法二存储动态规划状态需要 O ( n 2 ) O(n^2) O(n2)空间。

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN—力扣专栏,每日更新!

注: 如有不足,欢迎指正!

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

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

相关文章

Pytest+Webdriver+Alluer的UI自动化测试框架

作为web自动化的入门学习&#xff0c;搭建框架练习下 一、熟悉项目的测试框架的整体目录 二、 PIP安装完所需框架 1、编写main.py import pytestif __name__ __main__:#pytest.main() # 遍历相同目录下的所以test开头的用例#生成测试报告 #一次执行所有接口测试用例&…

【消费战略方法论】3W消费战略作业方法

3W消费战略 以消费者为核心导向的 品牌战略 品牌本质上属于消费者&#xff0c;消费者是品牌战略的核心。所有品牌工作都应把握一个标准&#xff0c;即是否围绕着消费者&#xff0c;是否对消费者有价值。一切的品牌战略、策略、创意、营销等工作都应该是为了“消费者”而设…

【Java|多线程与高并发】定时器(Timer)详解

文章目录 1. 前言2. 定时器的基本使用3. 实现定时器4. 优化上述的定时器代码5. 总结 1. 前言 在Java中&#xff0c;定时器Timer类是用于执行定时任务的工具类。它允许你安排一个任务在未来的某个时间点执行&#xff0c;或者以固定的时间间隔重复执行。 在服务器开发中,客户端向…

原型模式(Prototype)

定义 原型是一种创建型设计模式&#xff0c;使你能够复制已有对象&#xff0c;而又无需使代码依赖它们所属的类。 别名 克隆&#xff08;Clone&#xff09;。 前言 1. 问题 如果你有一个对象&#xff0c;并希望生成与其完全相同的一个复制品&#xff0c;你该如何实现呢&a…

基于工业智能网关的设备运维管理平台有何功能?

工业物联网平台作为监控工业设备和工业环境的智能应用&#xff0c;整合边缘和云端的数据优势&#xff0c;在制造业领域得到越来越丰富的应用。 在工业制造生产过程中&#xff0c;常常分为人、机、料、法、环等五大要素&#xff0c;其中机器设备的安全稳定运行时保证工厂生产效…

58同城AI Lab在WeNet中开源GPU热词增强功能

01 前言 端到端语音识别系统在足够多数据上训练后&#xff0c;往往能达到不错的识别效果&#xff0c;然而在实际应用场景中&#xff0c;对于不常见的专有名词&#xff0c;例如人名、产品名、小区名等&#xff0c;往往容易识别错误&#xff0c;此类问题需要快速修复&#xff0c…

DNS是什么?DNS的工作流程

79. DNS是什么&#xff1f; DNS&#xff08;Domain Name System&#xff09;是一种用于将域名解析为相应IP地址的分布式命名系统&#xff0c;了解DNS对于理解域名解析原理和优化网络请求非常重要。本篇文章将介绍DNS的概念、工作原理以及在前端开发中的应用&#xff0c;帮助前…

正则表达式-捕获组,命名捕获组,非捕获组

正则表达式的作用 测试目标字符串是否符合规则 返回true/false按照规则从目标字符串提取内容 返回匹配的数组 在线测试工具 regex101: build, test, and debug regexRegular expression tester with syntax highlighting, explanation, cheat sheet for PHP/PCRE, Python, …

java适配达梦数据库

目录 一、数据库安装 二、数据库可视化工具 三、数据迁移 四、工程适配 新增maven依赖 配置文件修改 基于flyway的数据库版本管理 五、注意事项 一、数据库安装 官方文档&#xff1a;安装前准备 | 达梦技术文档 这里有一个点需要注意&#xff0c;如果你之前的数据库或…

【Java高级语法】(十六)方法引用:掌握Java中的方法引用,简化代码的实用指南~

Java高级语法详解之方法引用 1️⃣ 概念2️⃣ 优势和缺点3️⃣ 使用3.1 语法形式3.2 案例 4️⃣ 应用场景5️⃣ 注意事项&#x1f33e; 总结 1️⃣ 概念 方法引用是Java编程语言中的一个重要特性&#xff0c;它首次出现在Java 8版本中。这一特性旨在简化函数式编程中使用Lambd…

【博客675】prometheus生产上易犯的错误

prometheus生产上易犯的错误 Mistake 1: Cardinality bombs 这是每个人在开始使用 Prometheus 时至少会遇到一次的经典陷阱。一旦您发现 Prometheus 基于标签的数据模型的有用性&#xff0c;您可能会想按各种有用的标签维度来拆分指标&#xff0c;直到您创建的时间序列超出 P…

【QT】枚举用到的宏详解:Q_ENUM,Q_FLAG,Q_DECLARE_FLAGS,Q_DECLARE_OPERATORS_FOR_FLAGS

目录 1. Q_ENUM宏 与 QMetaEnum类1.1 Q_ENUM宏的作用1.2 使用Q_ENUM注意的问题1.3 在写有关枚举的代码时&#xff0c;我们可能遇到这种情况&#xff1a;需要用到枚举的字符串&#xff0c;该怎么办&#xff1f;1.4 下面通过一段简单的代码来说明Q_ENUM的作用 2. Q_FLAG宏2.1 Q_F…

【SpringMVC】| 拦截器(含源码分析)

目录 拦截器 1. 拦截器的介绍 2. 拦截器的三个抽象方法 3. 拦截器的使用 4. 多个拦截器的执行顺序 Java核心技术大会 文末福利&#xff08;Java核心技术卷&#xff09; 拦截器 拦截器能拦截请求&#xff0c;前面学习的过滤器也能拦截请求&#xff0c;那两者有什么区别…

【数据结构与算法C++实现】1、异或的用法

原视频为左程云的B站教学 文章目录 1 异或换值2 求出数组中唯一一个出现奇数次的数3 求出数组中的两个出现奇数次的数 异或&#xff1a; 相同为0&#xff0c;不同为1。 更好的记忆方式&#xff1a; 不进位相加 10010 ^ 01100--------11110性质 0 ^ N N&#xff0c;N ^ N 0…

广电用户画像分析之根据用户行为数据进行筛选与标签添加

在数据处理和分析领域&#xff0c;我们经常需要根据用户的行为数据进行筛选和标签添加&#xff0c;以便更好地理解用户行为和偏好。在本篇博客中&#xff0c;我们将介绍两个示例&#xff0c;展示如何根据用户的收视行为数据和订单信息进行数据处理和分析。 前情提要&#xff1…

创新型影像测量仪器有哪些

走新型工业化之路&#xff0c;加快重塑竞争新优势&#xff0c;离不开更强的创新能力、更高的创新效率。新型工业化道路的基本标志和落脚点是要做到“科技含量高、经济效益好、资源消耗低、环境污染少、人力资源优势得到充分发挥”&#xff0c;并实现这几方面的兼顾和统一。而不…

spring boot 项目实现打包依赖分离

spring boot version 2.7 &#xff08;理论上是通用的&#xff09;Maven version 3 打包结果 重要文件以及文件夹解释 lib: 存在当前项目的全部依赖 other&#xff1a;和当前项目的 groupID 不同的依赖 project&#xff1a;和当前项目groupID 相同的依赖 XX-3.0.0-SNAPSHOT.j…

jdk安装及配置

一、下载安装包&#xff1a; 阿里云盘分享 提取码&#xff1a;am66 双击该程序 点击下一步 稍作等待即可。 二、配置环境变量 再新建一个系统变量CLASSPATH .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar 找到Path变量&#xff0c;双击编辑 Path变量。点击新建&…

【深度学习】GPT-2

在GPT1问世不久&#xff0c;和GPT很相似的BERT横空出世&#xff0c;并且在各方面都超越GPT-1。OpenAI在《Language Models are Unsupervised Multitask Learners》中于2019年提出的GPT-2&#xff0c;全称为Generative Pre-Training 2.0。提出语言模型式无监督的多任务学习 &…

DDS 信号发生器实验

目录 DDS 信号发生器实验 1、DDS 简介 2、实验任务 3、程序设计 3.1、DDS 顶层模块代码 3.2、clk_wiz IP 核 3.3、ILA IP 核&#xff08;集成逻辑分析器&#xff1a;Integrated Logic Analyzer&#xff0c;ILA&#xff09; 3.4、各波形参考代码 3.4.1、正弦信号波形采…