最长回文子串

最长回文子串

示例

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

题解分析

中心扩散法,遍历字符串第1个到第n减1个。拿到下标对比下标左右两边字符是否相等,根据是否相等记录最长回文子串长度和子串起始下标。最后由 string.substr()函数取出回文。

代码展示

string longestPalindrome(string s) {
        int maxlen = 1;
        int begin = 0;
        for (unsigned i = 0; i < s.size() - 1; i++)
        {
            int oddLen = func(s, i, i);				// 奇数下标
            int evenLen = func(s, i, i + 1);		// 偶数下标

            int curMaxLen = oddLen > evenLen ? oddLen : evenLen;

            if (curMaxLen > maxlen)
            {
                maxlen = curMaxLen;
                /*begin = i - (maxlen - 1) / 2;			// 奇数
                begin = i - (maxlen - 2) / 2;			// 偶数*/
                begin = i - (maxlen - 1) / 2;			
                // 合并   -1对奇偶个数都不影响,整数除法向下取整
            }
        }
        return s.substr(begin, maxlen);
    }
    int func(string& str, int left, int right)
    {
        while (left>=0 && right < str.size())
        {
            if (str.at(left) == str.at(right))
            {
                left--;
                right++;
            }
            else
            {
                break;
            }
        }
        return right - left - 1;
    }

心得

  1. func() 函数中,执行到return函数时,right 的下标和left 的下标应该是 回文所在的起始下标的前一个和结束下标后一个。while 先执行 内部语句再判断,当时未考虑到导致maxlen出错
  2. C++ 中的string.substr(begin, len); 函数参数为 begin: 截取字符的起始下标,len 截取字符的长度。
  3. 回文字符串begin的下标受回文个数是奇数还是偶数的影响,具体原因已写在注释中。

时间空间

时间复杂度:

空间复杂度:

勤学似春起之苗,不见其增,日有所长;辍学如磨刀之石,不见其损,日有所亏

陶渊明

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值