力扣 最长回文子串 C++ 题解

力扣 最长回文子串 C++ 题解


一、完整题目

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

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

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

提示:
1 <= s.length <= 1000
s 仅由数字和英文字母组成

二、具体思路

  • 利用动态规划的思想对此题进行求解(不会动态规划的戳链接)
  • 如果字串 [i, j] 是回文子串,那么 [i - 1, j - 1] 也一定为回文子串。因此,只需要对判断回文子串的字串 [i - 1, j - 1] 进行判断即可,所以递推公式为 dp [i][j] = dp [i + 1][j - 1]
  • 还需要考虑边界情况,当子串长度为1时,一定是回文子串,同时保证右边界越界不能越界

三、知识储备

利用 vector 初始化二维数组

一维初始化为:vector<int> array;
             vector<int> array(5);//初始化5个空间
             vector<int> vec(4,2);//初始化4个空间,并赋初值为2
二维初始化为:vector<vector<int>> array(n, vector<int>(m, initKey))
             //初始化为n * m的数组,并附初值initKey, 初值也可以不赋

四、编写代码

class Solution {
public:
    string longestPalindrome(string s) {
        int n = s.size();//input length

        if (n < 2) return s;//length = 1 must be correct

        int maxLen = 1;//max Length
        int begin = 0;//start position
        vector<vector<int>>  dp(n, vector<int>(n));//judge whether palindromic substring

        for (int i = 0; i < n; i++) dp[i][i] = true;//init

        for (int L = 2; L <= n; L++)
        {
            for (int i = 0; i < n; i++)
            {
                int j = L + i - 1;//right side
                if (j >= n) break;//right side overflow

                if (s[i] != s[j]) dp[i][j] = false;//if not equal, false
                else {
                    if (j - i < 3) dp[i][j] = true;//bound situation
                    else dp[i][j] = dp[i + 1][j - 1];//recursion formula
                }

                if (dp[i][j] && j - i + 1 > maxLen) { //judge max length and record
                    maxLen = j - i + 1;//record max length
                    begin = i;//record begin position
                }
            }
        }

        return s.substr(begin, maxLen);//return palindromic substring
    }
};

五、测评结果

在这里插入图片描述

动态规划就是用空间换时间。

六、总结评价

本题主要考察对动态规划的掌握程度,动态规划在各种竞赛以及大厂面试中,经常出现的题目,一定要好好掌握。

有问题欢迎各位大佬指出
力扣系列将持续更新,欢迎关注,一起学习

  • 12
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

S1XmKl

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

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

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

打赏作者

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

抵扣说明:

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

余额充值