最长回文子串

题目描述

对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。

给定字符串A以及它的长度n,请返回最长回文子串的长度。

牛客链接:https://www.nowcoder.com/practice/b4525d1d84934cf280439aeecc36f4af?tpId=188&tqId=38292&rp=1&ru=%2Factivity%2Foj&qru=%2Fta%2Fjob-code-high-week%2Fquestion-ranking&tab=answerKey

主要思路:逐个遍历将每次遍历的i为虚拟回文子串的中心!!

得到的子串分为两种类型为:baab和bab(baaab)

若为第一种则代码中的left和right的起始位置相邻

若为第二种则代码中的left和right的起始位置相同

import java.util.*;

public class Solution {
    public int getLongestPalindrome(String A, int n) {
        if(n<2)   //如果n小于2 则不构成回文串返回n
            return A.length();
        int max = 0; //max是最后要求得最长回文子串的长度
        for(int i=0;i<n;i++){  //遍历每一个位置的元素 判断其前一个后一个元素是否相等
            if(n-i<=max/2)  //当遍历到某i时 满足该条件说明 即使以i为中心的回文串最长仍然不会改变原来的max值
                break;
            int left = i;  //left由i位置左移
            int right = i;  //right由i位置右移  两数字来确定回文串的起始终止位置
            while(right<n-1&&A.charAt(right+1)==A.charAt(right))  
                //如果某i和他后面的值相等可能存在baab形式 此时left还是i right为i+1
                //若为baaab形式也不会有影响 遍历到下一个a时的max值会更高将他取代
                ++right;
            while(right<n-1&&left>0&&A.charAt(right+1)==A.charAt(left-1)){
                //确保right和left在数组范围内并且right和left值相等的情况下,将left左移right右移继续比较
                //得到以此时i为中心的回文子串的最大长度right-left+1
                ++right;
                --left;
            }
            //每次遍历的i得到的回文子串的最大长度right-left+1与max比较 得到最大值max
            if(right-left+1>max){
                max = right-left+1;
            }
        }
        return max;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值