Leetcode题库 5.最长回文子串(C++实现)

文章目录

解析

l为字符串长度
Max为最长回文子串长度
Max_R指向最长回文子串头部
Max_L指向最长回文子串尾部
p_r指向当前回文子串头部下标-1
p_l指向当前回文子串尾部下标+1

思路

遍历字符串s
假设s[i]为回文子串中心
则有两种情况
1、s[i]为中心(回文子串长度为奇数)
p_r=i-1
p_l=i+1
判断p_r,p_l是否越界
若不越界,则判断s[p_r]是否等于s[p_l]
若等于则将s[p_r],s[p_l]加入当前回文子串,p_r–,p_l++,返回上一步
若不等于则break
若越界,则break
判断当前回文子串长度是否大于Max
若大于,则Max_R,Max_L,Max更新

2、s[i],s[i+1]为中心(回文子串长度为偶数)
p_r=i
p_l=i+1
判断p_l是否越界
若不越界,则判断s[p_r]是否等于s[p_l]
若等于则将s[p_r],s[p_l]加入当前回文子串,p_r–,p_l++,返回上一步
若不等于则break
若越界,则break
判断当前回文子串长度是否大于Max
若大于,则Max_R,Max_L,Max更新

代码

#include <string>
class Solution {
public:
    string longestPalindrome(string s) {
        int l=s.size(),p_r,p_l,Max=1,Max_R,Max_L;
        for(int i=0;i<l;i++){
            p_r=i-1;
            p_l=i+1;
            while((p_r>=0 && p_l<l) && s[p_r]==s[p_l]){//最长回文子串长度为奇数
                p_r--;
                p_l++;
            }
            if(p_l-p_r-1>=Max){
                Max_R=p_r+1;
                Max_L=p_l-1;
                Max=Max_L-Max_R+1;
            }
            if(i+1<l){//最长回文子串长度为偶数
                p_r=i;
                p_l=i+1;
                while((p_r>=0 && p_l<l) && s[p_r]==s[p_l]){
                    p_r--;
                    p_l++;
                }
                if(p_l-p_r-1>=Max){
                    Max_R=p_r+1;
                    Max_L=p_l-1;
                    Max=Max_L-Max_R+1;
                }
            }
        }
        return s.substr(Max_R,Max);
    }
};
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值