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);
    }
}
相关推荐
怕浪猫4 分钟前
2840亿参数只卖白菜价:DeepSeek V4 Flash 正式版上线,Agent 能力暴涨6倍
人工智能·算法
让学习成为一种生活方式9 分钟前
苄基异喹啉生物碱糖基转移酶UGT74AN1晶体--Journal of Agricultural and Food Chemistry
人工智能·算法
alphaTao12 分钟前
LeetCode 每日一题 2026/7/27-2026/8/2
python·算法·leetcode
2501_9269783344 分钟前
提示工程的实战报告(二):模型的失败模式与边界行为
人工智能·深度学习·算法
小小晓.1 小时前
C++记:函数
开发语言·c++·算法
casual~1 小时前
模逆元计算方法详解:扩展欧几里得算法与费马小定理
学习·算法·逆元
脚踏实地皮皮晨1 小时前
002002002_DepandencyObject类2
开发语言·windows·算法·c#·visual studio
冻柠檬飞冰走茶3 小时前
PTA基础编程题目集 7-27 冒泡法排序(C语言实现)
c语言·开发语言·数据结构·算法
大鱼>4 小时前
因子挖掘+回测+RL交易:量化金融完整系统
人工智能·深度学习·算法·金融