leetcode每日一题---5. 最长回文子串

  1. 题目描述
  2. 题解
  3. 代码奉上
  4. 复杂度分析
  5. 闲话

题目描述

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例一

输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。

示例二

输入: “cbbd”
输出: “bb”

题目来源

leetcode

题解

首先,我们先从题目描述中得知,在一个字符串s要找到一个最长的回文字符串.在我看来,如果一个大佬把动态规划最多了,一看到一个最长,最多,最小,思路都将引向动态规划.你们都是大佬而我不是.
所以我们的思路要定在动态规划上,那么我们就要得出状态转移方程.
思路:

  1. 如果你要找一个回文字符串,那么他的前后字符都将是相等的,所以在一个字符串s里,如果你发现了前面某一个字符和对应的字符相等,且两个字符之间字符串也是一个回文字符串,那么这个字符串是最长的回文字符串吗?----相信你也知道答案是肯定的.

  2. 既然我们确定了我们确定最长字符串的方式,那么我们就要将其转化成一个状态转移方程.
    leetcode

  3. 有了状态转移方程后,我们就可以开开心心写代码了.但是基于第一点,我们的字符串s必须是两个以上的,相信你也明白,所以我们就需要将1个字符和2个字符独立去考虑.

以上思路总结就是:
首先单独考虑长度为1和2的字符串,然后根据状态转移方程确定s里面的最长的回文字符串,将其输出来.
如果你明白且清楚的话,请开始你的代码之旅吧!!!

代码奉上

class Solution {
public:
    string longestPalindrome(string s) {
        int n=s.size();
        vector<vector<int>> dp(n,vector<int>(n));
        string ans;
        int l;
        for(l=0;l<n;l++)
        {
            for(int i=0;i+l<n;i++)
            {
                int j=i+l;
                if(l==0)//长度为1的字符串
                dp[i][j]=1;
                else if(l==1)//长度为2的字符串
                dp[i][j]=(s[i]==s[j]);
                else
                dp[i][j]=(dp[i+1][j-1] && s[i]==s[j]);
                if(dp[i][j]&& 1+l>ans.size())
                ans=s.substr(i,1+l);//输出回文字符串
            }
        }
        return ans;
    }
};

温馨提示:如果你不明白substr,请百度或者帮助文档API里面查!!(如果需要API,我将发上去免费!!!)

复杂度解析

时间复杂度:O(n^2),其中 n是字符串的长度。循环了两次。
空间复杂度:O(n^2),即存储动态规划状态需要的空间。

闲话时刻

昨天是个孤独的一天,凌晨出的题目,这不早上就写了今天的题解!!!哈哈哈哈哈哈
考试周了.真的不喜欢在家里上课.

你好,我是大一小菜鸡(又菜瘾还大)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值