最长回文子串

题目描述#

难度中等

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

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

示例 1:

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

示例 2:

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

提示:

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

解题步骤#

动态规划解法,时间复杂度和空间复杂度都是O(n2)

class Solution:
    def longestPalindrome(self, s: str) -> str:
        # 动态规划解法
        # dp[i][j]表示s[i:j+1]是否为回文串
        # 边界条件:dp[i][i] = True; dp[i][i+1] = s[i] == s[i+1]
        # 状态转移方程:dp[i][j] = dp[i+1][j-1] and s[i] == s[j]
        n = len(s)
        max_len = 1
        res = s[0]
        dp = [[False] * n for i in range(n)]
        for i in range(n):
            dp[i][i] = True
        for i in range(n-1, -1, -1):
            for j in range(i+1, n):
                if j == i + 1:
                    dp[i][i+1] = s[i] == s[i+1]
                    if s[i] == s[i+1] and max_len == 1:
                        max_len = 2
                        res = s[i:i+2]
                else:
                    flag = dp[i+1][j-1] and s[i] == s[j]
                    dp[i][j] = flag
                    if flag and j - i + 1 > max_len:
                        max_len = j - i + 1
                        res = s[i:j + 1]
        return res
posted @   crazypigf  阅读(8)  评论(0编辑  收藏  举报
 
点击右上角即可分享
微信分享提示
主题色彩