给定一个字符串 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]