给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad" 输出: "bab" 注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd" 输出: "bb"
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
使用动态规划解题。关于动态规划,请参考:https://github.com/tim-chow/DataStructure/tree/master/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92。
设置二维数组 dp,若子串 s[i ... j] 是回文字符串,则 dp[i][j] = True,否则 dp[i][j] = False。状态转移方程为:
本题中的状态转移方程是从中间向两边递推的,因此需要注意循环顺序:
for j from 1 to len(s) - 1 {
for i from 0 to j {
DO SOMETHING;
}
}
class Solution:
def longestPalindrome(self, s):
size = len(s)
if size < 2:
return s
dp = [[False for _ in range(size)] for _ in range(size)]
max_len = 1
start = 0
for j in range(1, size):
for i in range(0, j + 1):
if i == j:
dp[i][j] = True
elif s[i] == s[j]:
if j - i < 3:
dp[i][j] = True
else:
dp[i][j] = dp[i + 1][j - 1]
else:
dp[i][j] = False
if dp[i][j]:
cur_len = j - i + 1
if cur_len > max_len:
max_len = cur_len
start = i
return s[start:start + max_len]