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]
思路:
-
设index和col代表着一个字符串中的左右索引,讨论(情况1)若col-index小于3,则夹在它们之间的子串必定为回文;(情况2)若col-index大于等于3,则需要讨论它们之间子串是否为回文且在index和col上的元素是否相等
-
新建matrix矩阵用于储存之前的状态,牺牲空间换取时间
-
第一层循环遍历每个col,第二层循环从0开始遍历到col(不含),若index和col位置上的元素不等,则直接跳过本轮循环;然后按情况1和情况2分别讨论。在第二层循环的结尾,判断matrix在当前位置的真假,然后将col-index+1与max进行比较,并将start设置为index(起始点)
-
返回
s[start:start+max]
复杂度分析:
- 时间复杂度O(n^2)
- 空间复杂度O(n^2)