力扣5----最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"
输出:"bb"

提示:

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

在本题目中将采用中心扩散法,此方法非常简单使用:

1.整体遍历,让字符串每个字符都当一次中心。

2.选取中心点的左右两边作为拓展对象,先判断是否与中心点相同,如果与中心点相同,则需要继续向左边或者右边进行拓展。

3.选择好拓展两个起始点之后,开始向左右两边同时扩展,如果遇到左右两边不相同则停止扩展,如果相同则继续。

4.扩展的同时需要注意记录每趟得出的最长回文的起始以及终止下标,由于我们直接初始化了一个最大长度,每躺比较之后,都会与最大长度比较,如果比最大长度大,则取代最大长度,并记录该回文的起始下标,这样也就不需要记录结束长度(可推导)。

以下是代码实现:

package com.wxy.lanqiaobei;

public class 最长回文子串 {
    public static String longestPalindrome(String s){
        //实时长度
        int len = 1;
        //总长度
        int strLen = s.length();
        //左右
        int left = 0,right = 0;
        //由于最后是提交字符串,需要记录符合的回文字符串头下标
        int maxStart = 0;
        //最大长度
        int maxLen = 0;
        for(int i = 0;i<s.length();i++){
            //表示指向中心点左右两个字符
            left = i - 1;
            right = i + 1;
            //向左扩展,当遇到与中心点相同则扩展
            while (left >= 0 && s.charAt(left) == s.charAt(i)){
                left--;
                len++;
            }
            //向左扩展,当遇到与中心点相同则扩展
            while (right < strLen && s.charAt(right) == s.charAt(i)){
                right ++;
                len ++;
            }

            //左右一起扩散
            while (left >= 0 && right < strLen && s.charAt(left) == s.charAt(right)){
                left --;
                right++;
                len++;
            }
            if(len > maxLen){
                maxLen = len;
                maxStart = left;
            }
            len = 1;
        }
        return s.substring(maxStart + 1,maxStart + maxLen + 1);
    }
    public static void main(String[] args) {

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值