LeetCode热题100--5. 最长回文子串--中等

题目

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

示例 1:

输入:s = "babad"

输出:"bab"

解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"

输出:"bb"

题解

java 复制代码
class Solution {
    public String longestPalindrome(String s) {
        if (s == null || s.length() < 2) {
            return s;
        }
        int strLen = s.length();
        int maxStart = 0;  //最长回文串的起点
        int maxEnd = 0;    //最长回文串的终点
        int maxLen = 1;  //最长回文串的长度

        boolean[][] dp = new boolean[strLen][strLen];

        for (int r = 1; r < strLen; r++) {
            for (int l = 0; l < r; l++) {
                if (s.charAt(l) == s.charAt(r) && (r - l <= 2 || dp[l + 1][r - 1])) {
                    dp[l][r] = true;
                    if (r - l + 1 > maxLen) {
                        maxLen = r - l + 1;
                        maxStart = l;
                        maxEnd = r;

                    }
                }

            }

        }
        return s.substring(maxStart, maxEnd + 1);

    }
}

解析

出自:中心扩散法和动态规划

java 复制代码
class Solution {
    public String longestPalindrome(String s) {
        // 如果字符串为空,或长度小于2(即0或1),直接返回原字符串(单个字符本身就是回文)
        if (s == null || s.length() < 2) {
            return s;
        }
        
        // 获取字符串的总长度
        int strLen = s.length();
        
        // 记录最长回文子串的起始索引(包含)
        int maxStart = 0;  
        
        // 记录最长回文子串的结束索引(包含)
        int maxEnd = 0;    
        
        // 记录当前找到的最长回文子串的长度,初始为1(至少一个字符)
        int maxLen = 1;  

        // 创建二维布尔数组 dp,dp[l][r] 表示子串 s[l...r] 是否为回文
        boolean[][] dp = new boolean[strLen][strLen];

        // 外层循环:遍历右边界 r,从1开始(因为长度为1的子串已是回文,无需处理)
        for (int r = 1; r < strLen; r++) {
            // 内层循环:遍历左边界 l,从0到r-1
            for (int l = 0; l < r; l++) {
                // 判断 s[l] 和 s[r] 是否相等,并且:
                //   - 如果子串长度 <= 3(即 r - l <= 2,如 "aa" 或 "aba"),只要两端相等就是回文;
                //   - 或者更长的子串,需依赖内部子串 s[l+1...r-1] 是否为回文(即 dp[l+1][r-1] 为 true)
                if (s.charAt(l) == s.charAt(r) && (r - l <= 2 || dp[l + 1][r - 1])) {
                    // 标记 s[l...r] 为回文
                    dp[l][r] = true;
                    
                    // 如果当前回文子串长度大于已记录的最大长度,则更新最大长度和起止位置
                    if (r - l + 1 > maxLen) {
                        maxLen = r - l + 1;      // 更新最大长度
                        maxStart = l;            // 更新起始索引
                        maxEnd = r;              // 更新结束索引
                    }
                }
                // 注意:如果 s[l] != s[r],dp[l][r] 默认为 false(无需显式赋值)
            }
        }
        
        // 使用 substring 提取最长回文子串(注意:substring 的 end 是 exclusive,所以 +1)
        return s.substring(maxStart, maxEnd + 1);
    }
}
相关推荐
计算机安禾9 分钟前
【算法分析与设计】第21篇:回溯法的状态空间树与剪枝函数设计
大数据·人工智能·算法·机器学习·数据挖掘·剪枝
磊 子10 分钟前
STL之set以及set和map区别
开发语言·c++·算法
晚风吹红霞17 分钟前
Linux下的趣味编程 —— 进度条、Git版本控制与GDB调试实战
linux·运维·git
nan madol18 分钟前
Rocky Linux 9.5 部署 Percona XtraDB Cluster (PXC) 集群
linux·运维·服务器
zincsweet19 分钟前
Linux 命名管道(FIFO)详解:原理分析、源码封装与通信流程图解
linux·服务器·c++·流程图
Promise微笑20 分钟前
算法突围:“双核四驱”理论下的“官网”AI引用概率提升指南
人工智能·算法·chatgpt
linux修理工21 分钟前
使用 virt-install 命令行快速创建 KVM 虚拟机(以 CentOS 7 为例)
linux·运维·centos
|_⊙23 分钟前
进程间通信(System V 标准下的多种通信方式)
linux·运维·服务器
KaMeidebaby26 分钟前
卡梅德生物技术快报|免疫共沉淀 - Co-IP 实验在转录因子 ATF3/Smad4 蛋白互作研究中的应用实例解析
网络·人工智能·网络协议·tcp/ip·其他·算法·新浪微博
wayz1130 分钟前
20260530 软件ETF(159852)量化分析
算法·金融·数据分析·量化交易