最长回文子串(Leetcode5)

例题:
分析:

先给出以下字符串,找出最长的回文子串

由题可知,最长的回文子串为 bcbabcb , 长度为7。

我们可以利用 中心开发思想 寻找最长回文子串,简单说就是以一个字符为中心点,由中心点向两边扩散,如果两边的字符相等,则继续扩散,直至两端的字符不相等,此时就找到了最长回文子串的左右边界(left,right)。

根据数组的遍历顺序,一开始以字符b为中心点,并记录此时回文子串的长度,如果后续找到了更长的回文子串,则替换之前的长度。如下图所示:

遍历数组一个一个往后找中心字符。

在这里发现字符b两端的字符相等,扩大范围。此时回文长度更新为3。依次类推....

但是在这里我们还遗漏了一种情况,我们只考虑了中心字符为奇数的情况, 中心字符为偶数 的情况未必比 中心字符为奇数 的长度短。

比如一开始以字符b和c作为中心点,向两边扩散。但这样显然不行,因为b、c不一样,必须找到两个一样的字符作为中心点。如下图:

注意:以两个字符作为中心点的时候,i不要遍历到数组末尾元素,否则会索引越界。

代码实现:
java 复制代码
public class LongestPalindromeLeetcode5 {

    public static void main(String[] args) {
        System.out.println(longestPalindrome("babad"));  // bab
        System.out.println(longestPalindrome("cbbd"));	 // bb
        System.out.println(longestPalindrome("a"));		 // a
    }

    static int left;
    static int right;

    public static String longestPalindrome(String s) {
        left = 0;
        right = 0;
        char[] chars = s.toCharArray();
        for (int i = 0; i < chars.length - 1; i++) {
            extend(chars, i, i);  //一个字符作为中心点
            extend(chars, i, i + 1);   //两个字符作为中心点
        }
        return new String(chars, left, right - left + 1);
    }

    /**
     * 中心开发方法
     * @param chars  要遍历的字符数组
     * @param i    中心点索引
     * @param j    中心点索引
     */
    public static void extend(char[] chars, int i, int j){
        //遇到相同字符则向左右两边扩散
        while(i >= 0 && j < chars.length && chars[i] == chars[j]){
            i--;
            j++;
        }
        //已经不是回文了,需要把i和j拉回边界
        i++;
        j--;
        if(j - i > right - left){
            left = i;
            right = j;
        }
    }
}
相关推荐
猿小羽几秒前
深度实战:Spring AI 与 MCP(Model Context Protocol)构建下一代 AI Agent
java·大模型·llm·ai agent·spring ai·开发者工具·mcp
catchadmin2 分钟前
Laravel12 + Vue3 的免费可商用 PHP 管理后台 CatchAdmin V5.1.1 发布
开发语言·php
李昊哲小课3 分钟前
机器学习核心概念与经典算法全解析
人工智能·算法·机器学习·scikit-learn
曾几何时`7 分钟前
二分查找(十)1146. 快照数组 pair整理
java·服务器·前端
编程(变成)小辣鸡19 分钟前
JVM、JRE和JDK 的关系
java·开发语言·jvm
lbb 小魔仙31 分钟前
【Java】Spring Cloud 微服务系统搭建:核心组件 + 实战项目,一步到位
java·spring cloud·微服务
a程序小傲38 分钟前
得物Java面试被问:流批一体架构的实现和状态管理
java·开发语言·数据库·redis·缓存·面试·架构
xb113239 分钟前
C#异步编程入门概念及核心概念
开发语言·c#
风筝在晴天搁浅40 分钟前
hot100 437.路径总和Ⅲ
算法
黎雁·泠崖42 分钟前
Java继承:成员变量访问(就近原则+this/super用法)
java·开发语言