【Leetcode】5. 最长回文子串(Longest Palindromic Substring)

No5. 最长回文子串

题目

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

示例 1

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

示例 2

  • 输入:s = “cbbd”
  • 输出:“bb”

示例 3

  • 输入:s = “a”
  • 输出:“a”

示例 4

  • 输入:s = “ac”
  • 输出:“a”

提示

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母(大写和/或小写)组成

解题代码(Python3)-动态规划

class Solution:
    def longestPalindrome(self, s: str) -> str:
        length = len(s)
        if length < 2:
            return s
        #生成状态矩阵
        matrix = [[False]*length for i in range(length)]
        max = 1
        start = 0
        for col in range(1,length):
            for index in range(0,col+1):
                if col == index:
                    matrix[index][col] = True
                if s[index] == s[col]:
                    if col - index < 3:
                        matrix[index][col] = True
                    else:
                        matrix[index][col] = matrix[index+1][col-1]
                    if ((max < col - index + 1) and matrix[index][col]):
                        max = col - index + 1
                        start = index
        return s[start:start+max]

思路:

在这里插入图片描述

  1. 设index和col代表着一个字符串中的左右索引,讨论(情况1)若col-index小于3,则夹在它们之间的子串必定为回文;(情况2)若col-index大于等于3,则需要讨论它们之间子串是否为回文且在index和col上的元素是否相等

  2. 新建matrix矩阵用于储存之前的状态,牺牲空间换取时间
    在这里插入图片描述

  3. 第一层循环遍历每个col,第二层循环从0开始遍历到col(不含),若index和col位置上的元素不等,则直接跳过本轮循环;然后按情况1和情况2分别讨论。在第二层循环的结尾,判断matrix在当前位置的真假,然后将col-index+1与max进行比较,并将start设置为index(起始点)

  4. 返回s[start:start+max]

复杂度分析:

  • 时间复杂度O(n^2)
  • 空间复杂度O(n^2)

运行结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Xiao_Spring/article/details/113666593