「笔试刷题」:最长回文子串(中心扩展算法)

一、题目

描述

对于长度为 n 的一个字符串 A(仅包含数字,大小写英文字母),请设计一个高效算法,计算其中最长回文子串的长度。

数据范围: 1≤n≤1000

要求:空间复杂度 O(1),时间复杂度 O(n^2)

进阶:  空间复杂度 O(n),时间复杂度 O(n)

示例1

输入:

"ababc"

返回值:

3

说明:

最长的回文子串为"aba"与"bab",长度都为3

示例2

输入:

"abbba"

返回值:

5

示例3

输入:

"b"

返回值:

1

二、思路解析

关于最长回文子串的这道题,我以前写过一篇博客,不过用的是动态规划来解决的,附上链接👇

「优选算法刷题」:最长回文子串icon-default.png?t=N7T8http://t.csdnimg.cn/Z6dvA

那本篇博客,我就换了 中心扩展算法 来做这道题,这也是我第一次接触到这个算法~

回文子串问题,重点在于判断奇偶性对于结果的影响。

从字符串的每个字符开始(用一层 for 循环来遍历),以该字符为中心向两边扩展,判断是否构成回文串,记录最长回文串的长度。

那我们先计算回文子串为偶数时的情况,这时候左边界 left 为 i - 1 ,右边界为 i + 1,然后再用 一层 whlie 循环,使 left 和 right 都到达临界点。

然后,同样是一层 while 循环,但这次 左边界 left 为 i,右边界为 i + 1,因为我们判断的是回文子串为奇数时的情况了。

遍历完所有字符后,即可得到最长回文子串的长度,具体实现请看下面代码👇

三、完整代码

import java.util.*;


public class Solution {
    public int getLongestPalindrome (String A) {
        int n = A.length();
        int ret = 0;

        for(int i = 0; i < n; i++){
            int left = i - 1;
            int right = i + 1;
            while(right < n && left >= 0 && A.charAt(left) == A.charAt(right)){
                right++;
                left--;
            }
            ret = Math.max(ret, right - left - 1);

            left = i;
            right = i + 1;
            while(right < n && left >= 0 && A.charAt(left) == A.charAt(right)){
                right++;
                left--;
            }
            ret = Math.max(ret, right - left - 1);            
        }
        return ret;
    }
}

以上就是本篇博客的全部内容啦,如有不足之处,还请各位指出,期待能和各位一起进步!

  • 16
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱敲代码的罗根

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值