链接
https://leetcode-cn.com/problems/longest-palindromic-substring/
前言
题目
给你一个字符串 s ,找到 s 中最长的回文子串。 示例1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例2:
输入:s = "cbbd"
输出:"bb"
示例3:
输入:s = "a"
输出:"a"
示例4:
输入:s = "ac"
输出:"a"
关键
思路1
- 动态规划
dp[i][j] 表示位置i到j的子串是否为回文串- i到j的子串为回文串需满足:
s[i]=s[j] dp[i+1][j-1] 为回文串 - 双遍历首先在长度
n 遍历右边位置j ,然后在j 的范围内遍历左边位置i - 回文子串的长度
span 有3种情况:
span=1 时,直接就是回文串span=2 时,需满足s[i]=s[j] span>2 即剩余其他情况时,需满足s[i]=s[j] 同时 dp[i+1][j-1] 为True
class Solution:
def longestPalindrome(self, s: str) -> str:
n = len(s)
if n < 2:
return s
dp = [[False]*n for _ in range(n)]
start = 0
max_len = 1
for j in range(n):
for i in range(j+1):
span = j-i+1
if span==1:
dp[i][j] = True
elif span==2:
dp[i][j] = s[i]==s[j]
else:
dp[i][j] = dp[i+1][j-1] and s[i]==s[j]
if dp[i][j]:
if span>max_len:
max_len=span
start = i
return s[start:start+max_len]
疑问
参考
[1] 5. 保姆级行行解析之python动态规划 [2] 【小鹦鹉】5 python 动态规划 中心扩展法
|