Leetcode - 5最长回文子串

本文详细解析了寻找字符串中最长回文子串的算法实现,通过定义变量start和end来跟踪最长回文子串的位置和长度,利用双指针left和right进行遍历与比较,有效地处理了奇数和偶数长度的回文串,提供了完整的C++代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

5 最长回文子串

题目描述

在这里插入图片描述

题目给出的接口为:
class Solution {
public:
    string longestPalindrome(string s) {
       
    }
};
题目分析

定义两个变量 start 和end,分别表示最长回文子串的起点跟长度,在遍历s中的字符的时候,我们首先判断剩余的字符数是否小于等于end 的一半。
是的话表明就算从当前到末尾到子串是半个回文串,那么整个回文串长度最多也就是 end,既然 end 无法变长,计算就没有意义,直接在当前位置 break 。
否则就要继续判断,我们用两个变量left和right分别指向当前位置,然后我们先要做的是向右遍历跳过重复项,这个操作很必要,比如对于 noon这种,只有先跳过重复,此时left指向第一个o,right指向第二个o,然后再向两边扩散。而对于 bob这种,无法向右跳过重复,此时 left 和 right 同时指向o,再向两边扩散也是正确的,所以可以同时处理奇数和偶数的回文串,之后的操作就是更新 end 和 start 了。

代码如下:
class Solution {
public:
    string longestPalindrome(string s) {
        if(s.size() < 2) return s;
        int n = s.size() , end = 0 , start = 0;
        for(int i = 0 ; i < n ;)
        {
            if(n - 1 <= end / 2) break;
            int left = i , right = i;
            while(right < n - 1 && s[right + 1] == s[right]) ++ right;
            i = right + 1;
            while(right < n - 1 && left > 0 && s[right + 1] == s[left - 1])             {
                ++ right;
                -- left;
            }
            if(end < right - left + 1)
            {
                end = right - left + 1;
                start = left;
            }
        }
        return s.substr(start , end);
    }
};

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿扬来了

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

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

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

打赏作者

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

抵扣说明:

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

余额充值