当前位置: 首页 > news >正文

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

(一)问题描述

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);
    }
}

相关文章:

  • AutoGen 技术博客系列 九:从 v0.2 到 v0.4 的迁移指南
  • 【多语言生态篇四】【DeepSeek×Rust:安全内存管理实践】
  • 断开ssh连接程序继续运行
  • 【进程 】
  • Windows系统本地部署DeepSeek-R1+本地知识库+联网搜索+Agent功能
  • 每日定投40刀BTC(4)20250218 - 20250222
  • Linux 驱动入门(5)—— DHT11(温湿度传感器)驱动
  • 迎接2025,立个flag
  • uniapp 中使用天地图,安卓端、h5
  • 解析多模态、Agent与Code模型的演进
  • 用Python实现Excel数据同步到飞书文档
  • 如何选择近视泳镜的度数
  • 自制操作系统学习第七天
  • 个人测试面经总结三
  • Spring Boot中如何使用Thymeleaf模板引擎
  • 利用vtkTransform类对模型位置变换、缩放、镜面成像等
  • 医疗报销系统的设计与实现(代码+数据库+LW)
  • 深入HBase——核心组件
  • 球队训练信息管理系统设计与实现(代码+数据库+LW)
  • 分布式事务三阶段协议
  • 特朗普要征100%关税,好莱坞这批境外摄制新片能躲过吗?
  • 魔都眼|上海环球马术冠军赛收官,英国骑手夺冠
  • 国防部新闻发言人就日本民用飞机侵闯中国钓鱼岛领空答记者问
  • 美国鞋类巨头请求白宫豁免关税,称已构成“生存威胁”
  • 两部门调度部署“五一”假期安全防范工作,要求抓好旅游安全
  • 秦洪看盘|资金切换主线,重构市场风格