leetcode 05:最长回文子串(python)

题目

给定一个字符串 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]
  • 结果
    在这里插入图片描述

你可能感兴趣的:(leetcode,算法)