本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
题目链接:LeetCode 5. 最长回文子串
难度:中等
一、题目描述
给你一个字符串 s,找到 s 中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
示例 3:
输入:s = "a"
输出:"a"
示例 4:
输入:s = "ac"
输出:"a"
提示:
- 1 <= s.length <= 1000
- s 仅由数字和英文字母(大写和/或小写)组成
二、思路分析
思路1:从0到n,以某1个或2个位置为中心,找到其最长回文串,在这个过程中,不断比较并保留最长回文子串。
思路2:判断一个字符串是不是回文串很简单了。从长到短,判断字符串是不是回文串就可以了,判断为是的时候,立即返回即可,因为是从长到短的嘛,更长的不行,才会轮到现在的串来判断。
三、AC 代码
按照思路1
def longestPalindrome(self, s: str) -> str:
n = len(s)
if n == 0:
return ""
def getPalindrome(s,l,r):
while l >= 0 and r < len(s) and s[l]==s[r]:
l-=1
r+=1
return s[l+1:r]
res = getPalindrome(s,0,0)
for i in range(1,n):
candidate = getPalindrome(s,i,i)
if len(candidate) > len(res):
res = candidate
candidate = getPalindrome(s,i-1,i)
if len(candidate) > len(res):
res = candidate
return res
四、总结
做题不要一开始就尝试想高效的办法,先想到的办法就可以先尝试。做出来了或者做不出来才考虑其他方法。
就这题来说,即使有DP的办法,时间复杂度是一样的,但DP空间复杂度更高,还不如这个方法。
如果你觉的还不错的话,给我点个赞吧💐