问题:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
题目来源:力扣(LeetCode)
难度:中等
分析:
这道题的官方解法非常好,很清晰。
解决方法:
1:暴力解法,遍历
class Solution():
def longestPalindrome(self,s):
#边界条件,主要是要判断字符串不能为空,否则下标会溢出
if s == s[::-1]: return s #
max_length = 1 #初始化,要更新的字串长度
res = s[0] #初始字串
for i in range(0,len(s)-1):#遍历数组,注意下标
for j in range(i+1,len(s)): #遍历,注意下标
#判断是否存在新子串更长,如果存在,则更新最长字串长和最长字串
#使用了python的切片方式来判断字串是否相同,导致时间复杂度O(n^2)
#如果不用切片,则是否为回文仍需要一次遍历来判断,复杂度为O(n^3)
if j-i+1 > max_length and s[i:j+1]==s[i:j+1][::-1]:
max_length = j-i+1 #更新最长字串长
res = s[i:j+1] #更新最长字串
return res
复杂度:O(n^3)
2:动态规划法
回文字符串天生具有状态转移的性质,一个字符串是否为回文永远依赖于其内层字符串是否为回文。
因此考虑动态规划解法,这一题动态规划的难度在于将状态建表。理解了将求解过程转变为求状态,和建表的方法,这一解法就很简单了。
class Solution:
def