5. 最长回文子串

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

示例 1:

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

示例 2:

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

在这里插入图片描述
代码:

class Solution:
    def longestPalindrome(self, s: str) -> str:
        n = len(s)
        dp = [[False]*n for _ in range(n)]
        max_len = 1
        start = 0
        cur_len = 0
        for j in range(n):
            for i in range(j):
                # 确定好边界条件
                if j - i <= 2:
                    if s[i] == s[j]:
                        dp[i][j] = True
                        cur_len = j - i + 1
                else:
                    # 定义好状态转移方程
                    if dp[i+1][j-1] == True and s[i] == s[j]:
                        dp[i][j] = True
                        cur_len = j - i + 1
                # 出现回文串,更新输出
                if dp[i][j]:
                    if max_len < cur_len:
                        max_len = cur_len
                        start = i
        return s[start:start+max_len]

换一种写法:

class Solution:
    def longestPalindrome(self, s: str) -> str:
        length = len(s)

        matrix = [[False] * length for _ in range(length)]
        left = 0
        right = 0
        max_length = 1

        for r in range(1,length):
            for l in range(0, r):
                if s[l] == s[r] and (r -l <= 2 or matrix[l+1][r-1]):
                    matrix[l][r] = True
                    if r - l + 1 > max_length:
                        max_length = r - l + 1
                        left = l
                        right = r
        return s[left:right+1]

posted @ 2022-05-02 16:04  小Aer  阅读(2)  评论(0编辑  收藏  举报  来源