LeetCode:5. 最长回文子串

简介

题目链接:https://leetcode.cn/problems/longest-palindromic-substring/description/

解决方式:字符串 + 暴力枚举 / 中心扩展法(双指针)

暴力枚举

实现思路:

双重循环暴力枚举,枚举每一个可能的字符串,判断其是否是回文子串,是则进行下一步与全局维护的最大回文子串进行对比,实时更新最大回文子串。

java 复制代码
class Solution {
    public String longestPalindrome(String s) {
        int n = s.length();
        int maxLen = 0;
        int start = 0; // 记录最长回文子串的起始索引

        // 枚举所有子串的起始位置
        for (int i = 0; i < n; i++) {
            // 枚举所有子串的结束位置
            for (int j = i; j < n; j++) {
                if (isPalindrome(s, i, j)) {
                    int len = j - i + 1;
                    if (len > maxLen) {
                        maxLen = len;
                        start = i;
                    }
                }
            }
        }
        return s.substring(start, start + maxLen);
    }

    // 判断子串 s[i..j] 是否为回文串
    private boolean isPalindrome(String s, int left, int right) {
        while (left < right) {
            if (s.charAt(left) != s.charAt(right)) {
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
}

中心扩展法

实现思路:

回文子串会有中心点,可能是一个(奇数)也可能是两个(偶数)。我们可以迭代所有可能的中心点,判断当前中心点是否是回文子串,然后由中心点周围扩展。同时维护一个全局最大回文子串,迭代的每一个回文子串都与全局最大进行对比,实时更新全局最大回文子串。

java 复制代码
class Solution {
    public String longestPalindrome(String s) {
        int n = s.length();
        // 全局最长回文子串(左闭右开)
        int maxLeft = 0;
        int maxRight = 0;
        // 迭代所有可能的中心点
        for(int center = 0; center < 2*n-1; center++){
            // 初始化双指针指向奇数或偶数中心
            int left = center / 2;
            int right = (center + 1) / 2;
            // 扩展回文子串,直到双指针指向回文子串边界的外侧
            while(left >= 0 && right < n && s.charAt(left) == s.charAt(right)){
                right++;
                left--;
            }
            // 比较该回文子串与全局最大回文子串
            if(right - left - 1 > maxRight - maxLeft){
                // 更新最大回文子串
                maxLeft = left + 1;
                maxRight = right;
            }
        }
        // 返回结果
        return s.substring(maxLeft, maxRight);
    }
}

另一种写法

java 复制代码
class Solution {
    public String longestPalindrome(String s) {
        int n = s.length();
        // 全局最长回文子串(左闭右开)
        int maxLeft = 0;
        int maxRight = 0;
        // 迭代所有可能的中心点
        for(int i = 0; i < n; i++){
            // 初始化双指针指向奇数中心
            int left = i;
            int right = i;
            // 扩展回文子串,直到双指针指向回文子串边界的外侧
            while(left >= 0 && right < n && s.charAt(left) == s.charAt(right)){
                right++;
                left--;
            }
            // 比较该回文子串与全局最大回文子串
            if(right - left - 1 > maxRight - maxLeft){
                // 更新最大回文子串
                maxLeft = left + 1;
                maxRight = right;
            }

            // 初始化双指针指向偶数中心
            left = i;
            right = i + 1;
            // 扩展回文子串,直到双指针指向回文子串边界的外侧
            while(left >= 0 && right < n && s.charAt(left) == s.charAt(right)){
                right++;
                left--;
            }
            // 比较该回文子串与全局最大回文子串
            if(right - left - 1 > maxRight - maxLeft){
                // 更新最大回文子串
                maxLeft = left + 1;
                maxRight = right;
            }
        }
        // 返回结果
        return s.substring(maxLeft, maxRight);
    }
}
相关推荐
JieE21215 小时前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
JieE2122 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
Jack202 天前
HarmonyOS开发中错误处理策略:网络异常统一处理
算法
小小杨树2 天前
读懂色彩:拍照调色不再难
算法·计算机视觉·配色
JieE2123 天前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE2123 天前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
vivo互联网技术3 天前
CVPR 2026 | 全新强化学习框架 BeautyGRPO:重塑真实人像
算法·大模型·cvpr·影像
Darling噜啦啦3 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
用户497863050733 天前
(一)小红的数组操作
算法·编程语言