最长回文子串(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;
        }
    }
}
相关推荐
转调9 分钟前
每日一练:地下城游戏
开发语言·c++·算法·leetcode
Java探秘者10 分钟前
Maven下载、安装与环境配置详解:从零开始搭建高效Java开发环境
java·开发语言·数据库·spring boot·spring cloud·maven·idea
攸攸太上10 分钟前
Spring Gateway学习
java·后端·学习·spring·微服务·gateway
2301_7869643616 分钟前
3、练习常用的HBase Shell命令+HBase 常用的Java API 及应用实例
java·大数据·数据库·分布式·hbase
2303_8120444619 分钟前
Bean,看到P188没看了与maven
java·开发语言
苹果醋319 分钟前
大模型实战--FastChat一行代码实现部署和各个组件详解
java·运维·spring boot·mysql·nginx
秋夫人21 分钟前
idea 同一个项目不同模块如何设置不同的jdk版本
java·开发语言·intellij-idea
m0_6640470226 分钟前
数字化采购管理革新:全过程数字化采购管理平台的架构与实施
java·招投标系统源码
不穿格子衬衫37 分钟前
常用排序算法(下)
c语言·开发语言·数据结构·算法·排序算法·八大排序
萧鼎43 分钟前
Python调试技巧:高效定位与修复问题
服务器·开发语言·python