LeedCode刷题笔记-最长回文子串

LeedCode刷题笔记-最长回文子串

题目描述

给你一个字符串 s,找到 s 中最长的回文子串。

ps:回文子串,就是一个字符串最常顺序书写和逆序书写,内容是一样的,如abba

示例 1:

输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:

输入:s = “cbbd”
输出:“bb”
示例 3:

输入:s = “a”
输出:“a”
示例 4:

输入:s = “ac”
输出:“a”

提示:

1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成

解题代码

class Solution
{
public:
    string longestPalindrome(string s) 
    {
        //先对空字符串进行判断处理
        if(s.length() < 1)
        {
            return " ";
        }
        //这里使用中心拓展法,分别重头对字符串每一个字符当作回文中心,对两边进行拓展判断
        int start = 0, end = 0, len = 0, len1 = 0, len2 = 0, i = 0;
        for(i = 0; i < s.length(); i++)
        {
            /* 传入i,i 就是求字符串个数为奇数时的最长子串长度 */
            len1 = expend_around_center(s, i, i);
            /* 传入i,i + 1 就是求字符串个数为偶数时的最长子串长度 */
            /* 其实就是把偶长度的字符串中间两个字符看作一个整体中心 */
            len2 = expend_around_center(s, i, i + 1);
            len = max(len1, len2);
            /* 每循环一次如果有更长的回文子串长度出现,则更新输出数据的start和end */
            if(len > end - start)
            {
                /* 这里的数据为什么要-1,只需要带上面的实例字符串就可以推导得出了 */
                start = i - (len - 1) / 2;		
                end = i + len / 2;
            }
        }
        return s.substr(start, end - start + 1);

    }
    /* 此函数用于求传入字符所能形成的最长回文子串长度 */
    int expend_around_center(string &s, int L, int R)
    {
        while(L >= 0 && R <= s.length() && s[L] == s[R])
        {
            L--;
            R++;
        }
        return R - L -1;
    }
};

方法总结

  • 使用的是中心拓展法,就是把字符串的每一个字符都当作回文子串的中心,向两边拓展,求出其能成立的最长回文子串长度;然后取所有单个字符作为回文子串中心时字符串长度的最大值。
  • 最后把expend_around_center()的传参string s 改为了 string &s,程序运行的效率提升很大

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vTgt26qz-1610348848398)(https://i.loli.net/2021/01/11/SHbOtX3ez5mpZJg.png)]

所以,以后写代码可以注意一下传参问题,可以使用引用和指针传参的,就不必使用值拷贝传参了,很浪费时间和空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值