力扣:5、最长回文子串
力扣小白的自闭学习过程,争取做到每日更新,加油
题目描述
给你一个字符串 s s s,找到 s s s中最长的回文子串。
示例 1:
输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd"
输出:"bb"
示例 3:
输入:s = "a"
输出:"a"
示例 4:
输入:s = "ac"
输出:"a"
提示:
1 <= s.length <= 1000
s 仅由数字和英文字母(大写和/或小写)组成
一、动态规划
找到的好理解的方法,还是缺乏完全自主做题的能力,再次成为一个搬运工,原版链接。
解题思路
- 动态规划:
1、 d p [ i ] [ j ] dp[i][j] dp[i][j]表示 s [ i : j ] s[i:j] s[i:j]是否为回文串;
2、如果 s [ i ] = = s [ j ] s[i] == s[j] s[i]==s[j],则 d p [ i ] [ j ] = = d p [ i + 1 ] [ j − 1 ] dp[i][j] == dp[i+1][j-1] dp[i][j]==dp[i+1][j−1];
3、每次更新完dp[i][j]之后,更新 m a x l e n max_len maxlen和 s t a r t start start。 - 边界
1、 l e n ( s ) < 2 len(s) < 2 len(s)<2时必为回文串;
2、 d p [ i ] [ i ] = T r u e dp[i][i]=True dp[i][i]=True。
class Solution:
def longestPalindrome(self, s: str) -> str:
# 动态规划,dp[i][j]表示s[i:j]是否为回文子串
# 每次判断s[i][j]时更新maxlen=j-i+1和start=i
# 边界,当j-i+1<2时,肯定是回文串
n = len(s)
dp = [[False]*n for _ in range(n)]
start, max_len = 0, 1
# 边界
if n < 2:
return s
# 初始化
for i in range(n):
dp[i][i] = True
# 枚举区间终点
for j in range(1, n):
# 枚举起点
for i in range(0, j):
if s[i] == s[j]:
if j - i < 3:
dp[i][j] = True
else:
dp[i][j] = dp[i+1][j-1]
if dp[i][j]:
l = j - i + 1
if l > max_len:
max_len = l
start = i
return s[start: start+max_len]
执行结果
参考内容: 1、https://leetcode-cn.com/problems/longest-palindromic-substring/solution/dong-tai-gui-hua-ni-chao-rong-yi-li-jie-j8frz/