题目:
给定一个字符串 s
,找到 s
中最长的回文子串。你可以假设 s
的最大长度为 1000。
示例1:
输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案。
示例2:
输入: "cbbd"输出: "bb"
解题思路:
举个例子,“b”是一个回文子串,左右两边同时加入“a”,则“aba”也一定是回文子串,如此可以得出一个结论:在回文子串左右加入相同的字符,新的子串也一定是回文子串。
长度为1的字符是回文子串。
长度为2的字符串,如果左右字符相同,则该字符串为回文子串。
由1-3的结论可以通过动态规划思想来解此题。
Python代码:
class Solution: def longestPalindrome(self, s: str) -> str: s_length = len(s) # 记录每一个字符片段是否是回文子串 status = [[False] * s_length for _ in range(s_length)] result = "" # length是字符串片段的长度 for length in range(s_length): # i, j 分别指向字符串片段的左右两端 for i in range(s_length): j = i + length if j >= s_length: break if length == 0: status[i][j] = True elif length == 1: status[i][j] = (s[i] == s[j]) else: status[i][j] = status[i + 1][j - 1] and (s[i] == s[j]) if status[i][j] and length + 1 > len(result): result = s[i:j + 1] return result
--END--