Leetcode 腾讯50题 day1

Leetcode 腾讯50题 day1

No.5 最长回文子串

题目描述:

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

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成

解题思路:
综述:这道题是一道可以用动态规划解决的题,对于刚开始接触算法的同学,首先要解决怎么想到这题可以用动态规划解决,在想到要用动态规划解决的时候,重心则要放在该怎么定义状态状态转移方程是什么

1.为什么可以用动态规划解决?

在讲思路之前,还是建议如果看这篇文章的同学对动态规划不太了解的话,可以先做一些动态规划的基本题,如01背包,最长公共子序列等熟悉动态规划的原理。
接下来我们先使用最笨的办法解决这道题,先用暴搜来试试看。以s=abcad作为题目来讲解。

1.1 不会dp没关系,先用暴搜

要找最长的回文子串,当然要把所有的子串都遍历一下,看看它是不是回文串,最后取最长的。这里显然可以用贪心的思路去做,即从最长的字符串开始判断,看它是不是回文串,如果不是则依次判断等长的或者更短的。
在这里插入图片描述
这个表格表示的是使用贪心的思路,数字代表字符在字符串中的位置,以0开始,后面的字符代表该位置的值,从上往下代表暴搜的检索过程,使用贪心加暴搜就要从最长的字符串开始。这个表格代表的含义是,从最长的字符串开始,检查abcad是否回文,检查abca是否回文,检查bcad是否回文…最终检查了所有的字符串,发现没有长度为2的回文子串,因此结果为1。这个答案肯定可以做对,但是时间复杂度为O(n三次方),那么这个算法慢在哪里呢?(备注:写博客的时候我又实现了一下贪心算法,由于这道题的数据长度是1000,所以n的三次方也不会暴时,先放一下贪心法的代码)

class Solution:
    def longestPalindrome(self, s: str) -> str:
        for i in range(len(s)-1, 0, -1):
            for j in range(len(s)-i):
                t = s[j:j+i+1]
                # print(t)
                if t==t[::-1]:
                    return t
        return s[0]

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值