题目
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法一(中心扩展法)
- 思路
把字符串中每个字符作为中心,往两边扩展
注意区分奇偶回文子串的区别(即"ada"或"adda") - 代码
class Solution:
def longestPalindrome(self, s: str) -> str:
lens=len(s)
if lens<2:
return s
maxlen,index=1,0
for i in range(lens-1):
l1,l2,r1,r2=i,i,i,i+1
#处理奇回文串
while l1>=0 and r1<lens and s[l1]==s[r1]:
l1-=1
r1+=1
if maxlen<r1-l1-1:
maxlen=r1-l1-1
index=l1+1
#处理偶回文串
while l2>=0 and r2<lens and s[l2]==s[r2]:
l2-=1
r2+=1
if maxlen<r2-l2-1:
maxlen=r2-l2-1
index=l2+1
return s[index:index+maxlen]
- 结果
解法二(动态规划法)
- 思路
参考https://blog.csdn.net/LSGO_MYP/article/details/100103126
将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间 - 代码
lass Solution:
def longestPalindrome(self, s: str) -> str:
lens=len(s)
if lens<2:
return s
maxlen,index=1,0
#定义二维数组储存从i到j的字符串是否为回文串
dp=[[False for j in range(lens)]for i in range(lens)]
for r in range(lens-1):
r+=1
for l in range(r):
if s[l]==s[r] and (r-l<3 or dp[l+1][r-1]==True):
dp[l][r]=True
if maxlen<r-l+1:
maxlen=r-l+1
index=l
return s[index:index+maxlen]
- 结果