5. 最长回文子串
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
常规的暴力法就是遍历各个子串,并且判断子串是否是回文串,这样时间复杂度为O(n^3)
接下来我们看动态规划做法
我们假设一个dp数组,dp[i][j]表示s[i…j]是否为回文串
由于回文子串具备天然的状态转移特性
当两头字母相同时,去掉两头字母,剩下的子串也应该是回文串
dp[i][j] = (s[i]==s[j]) and dp[i+1][j-1]
另外我们需要判断不构成区间的情况
当(j-1) - (i+1) + 1 < 2时,子串并不构成区间
需要额外判断
综上我们有以下代码
class Solution:
def longestPalindrome(self, s: str) -> str:
length = len(s)
if length < 2:
return s
maxlen = 1
begin = 0
dp = [[False]*length for _ in range(length)]
for i in range(length):
dp[i][i] = True
for j in range(1, length):
for i in