【每日一题】最长回文子串

5. 最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串。

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"
输出:"bb"

提示:

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

这题常规思路是用动规,如果一个回文串前后相邻的两字符相同,那么就可以扩张成一个新回文串。边界条件就是子串的长度为1或2,长为1的子串自然是回文串,长为2若两个字符相同那么也是回文串。换个角度我们也可以从边界条件外推,也就是中心扩展法。

class Solution:
    def longestPalindrome(self, s: str) -> str:
        # dp(i,j)表示s[i..j]是否是回文喘
        # dp[i,i] = 1
        # dp(i,i+1) = 1 when s[i]==s[i+1]
        # dp(i,j) = 1 when dp(i+1,j-1)==1 and s[i]==s[j]
        
        # 从边界条件向外扩展
        def expand(s, l, r):
            while l >= 0 and r < len(s) and s[l] == s[r]:
                l -= 1
                r += 1
            return l+1, r-1

        l, r = 0, 0
        for i in range(len(s)):
            l1, r1 = expand(s, i, i) # 边界条件 长度为1的子串
            l2, r2 = expand(s, i, i+1) # 边界条件 长度为2的子串
            if (r1-l1) > (r-l):
                l, r = (l1, r1)
            if (r2-l2) > (r-l):
                l, r = (l2, r2)
        return s[l: r+1]

 

posted @ 2024-05-10 16:53  Aikoin  阅读(5)  评论(0编辑  收藏  举报