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]