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);
    }
}
相关推荐
luj_17685 小时前
残熵算法实时化三大瓶颈突破
c语言·开发语言·网络·经验分享·算法
mCell6 小时前
你以为短链接只是 Hash + 301/302?
后端·算法·架构
KaMeidebaby7 小时前
卡梅德生物技术快报|抗体亲和力成熟工业化调控新机制:差异性浆细胞增殖工艺优化思路
java·开发语言·人工智能·算法·机器学习·架构·spark
luj_17687 小时前
心形曲线轨迹控制三大关键技术
c语言·开发语言·c++·经验分享·算法
tmlx3I0818 小时前
高光谱拼接算法(六)RANSAC 误匹配剔除
人工智能·算法·机器学习
不相心 -w-8 小时前
基础-滑动窗口-(定长 | 不定长)
算法
醉城夜风~8 小时前
Java详解经典算法题:接雨水(三种实现方案+原理剖析)
java·开发语言·算法
ysa0510308 小时前
【板子】ST表
c++·笔记·算法·板子
CHHH_HHH9 小时前
【C++11】深入解析C++可变参数模板
开发语言·c++·算法·stl·c++11
hurrycry_小亦9 小时前
洛谷题目:P1215 [USACO1.4] 母亲的牛奶 Mother‘s Milk 题解(本题简)
算法