leetcode刷题记录(一百一十六)——5. 最长回文子串

news/2025/2/23 14:10:10

(一)问题描述

5. 最长回文子串 - 力扣(LeetCode)5. 最长回文子串 - 给你一个字符串 s,找到 s 中最长的 回文 子串。 示例 1:输入:s = "babad"输出:"bab"解释:"aba" 同样是符合题意的答案。示例 2:输入:s = "cbbd"输出:"bb" 提示: * 1 <= s.length <= 1000 * s 仅由数字和英文字母组成https://leetcode.cn/problems/longest-palindromic-substring/description/?envType=study-plan-v2&envId=top-100-liked给你一个字符串 s,找到 s 中最长的 回文 子串。

示例 1:

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

示例 2:

输入:s = "cbbd"
输出:"bb"

提示:

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

 (二)解决思路

        这道题是用动态规划来解决的(乍一看很难想到动态规划上,但我觉得“最长”这种字眼出现了,在想不到其他方法的前提下都可以考虑是不是贪心或者动态规划)。

        dp数组是布尔型数组,dp[i][j]用来表示 i 和 j 之间的子串是不是回文串。

        比较容易看出的递推关系是,对于任何满足s.charAt(i)=s.charAt(j)的子串,dp[i][j]=dp[i+1][j-1],例如在abba这个回文串里dp[0][3]=dp[1][2]。这里要比较哪个回文子串的长度更长,所以比较特别的一点是遍历的是子串的长度,而非终止位置j,j是通过子串长度和起始位置i计算得到的。

class Solution {
    public String longestPalindrome(String s) {
       
       int m = s.length();
       if(m<2) return s;
       boolean[][] dp = new boolean[m][m];
       for(int i=0;i<m;i++){
            dp[i][i]=true;
       }

       //begin用来记录最长回文子串的起始位置
       int begin=0;
       int maxLen=1;
       //遍历长度,用长度和起始位置i来计算终止位置j
       for(int len=2;len<=m;len++){
            for(int i=0;i<m;i++){
                int j = len+i-1;
                if(j>=m) break;

                if(s.charAt(i)!=s.charAt(j)){
                    dp[i][j]=false;
                }
                else{
                    if(j-i<2){
                        dp[i][j]=true;
                    }else{
                        //当j-i<2时,这种情况会导致j-1<i+1,此时dp[i+1][j-1]不合法;
                        //boolean默认值为false
                        dp[i][j] = dp[i+1][j-1];
                    }  
                }

                if(dp[i][j]&&j-i+1>maxLen){
                    maxLen = j-i+1;
                    begin = i;
                }
            }
       }
       return s.substring(begin,begin+maxLen);
    }
}

http://www.niftyadmin.cn/n/5863462.html

相关文章

Docker实战-使用docker compose搭建博客

docker run 部署 创建blog网络 [rootk8s-master ~]# docker network create blog 8f533a5a1ec65eae3f98c0ae5a76014a3ab1bf3c087ad952cdc100cc7a658948 [rootk8s-master ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 8f533a5a1ec6 blog bridge …

大语言模型微调的公开JSON数据

大语言模型微调的公开JSON数据 以下是一些可用于大语言模型微调的公开JSON数据及地址: EmoLLM数据集 介绍:EmoLLM是一系列能够支持理解用户、帮助用户心理健康辅导链路的心理健康大模型,其开源了数据集、微调方法、训练方法及脚本等。数据集按用处分为general和role-play两种…

【GPU驱动】- 状态机

一、概述 Mesa 是一个开源的图形库&#xff0c;它提供了一个通用的图形抽象层&#xff0c;支持多种硬件和驱动程序。Mesa 的核心组件之一是 State Tracker&#xff0c;它在抽象图形 API&#xff08;如 OpenGL &#xff09;与具体的图形驱动之间起到桥梁作用。State Tracker 通…

基于SSM的《计算机网络》题库管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘 要 《计算机网络》题库管理系统是一种新颖的考试管理模式&#xff0c;因为系统是用Java技术进行开发。系统分为三个用户进行登录并操作&#xff0c;分别是管理员、教师和学生。教师在系统后台新增试题和试卷&#xff0c;学生进行在线考试&#xff0c;还能对考生记录、错题…

c#编程:学习Linq,重几个简单示例开始

学习LINQ&#xff08;Language Integrated Query&#xff09;是掌握C#中数据处理和分析的重要一步。LINQ 提供了一种简洁、声明性的方式来查询和操作内存中的数据集合&#xff08;如数组、列表等&#xff09;以及数据库中的数据。 以下是一些入门级的经典LINQ示例&#xff0c;…

VIM FZF 安裝和使用

在 Vim 中安装和使用 fzf 进行文件、函数、变量、宏定义的模糊匹配 以下是详细步骤&#xff1a; 1. 安装 fzf 和 fzf.vim 插件 1.1 安装 fzf 工具 fzf 是一个命令行模糊查找工具&#xff0c;必须先安装它。根据你的操作系统选择安装方式&#xff1a; macOS: brew install fz…

2502C++,C++继承的多态性

构 A{单 向量<串>记;元<类 T>静 空 ff(串&a){清理(记);名向量(a,记);串 b{"---ff---"};打印(b);T::g();} };构 B:公 A{元<类 T>静 空 f(){串 a{"错误.txt"};ff<T>(a);} };构 C:公 A{元<类 T>静 空 f(){串 a{"a12.c…