题目描述
给你一个字符串 s
,找到 s
中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例 1:
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd" 输出:"bb"
思路 【参考官方题解:动态规划】
class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
"""
n = len(s)
if n < 2:
return s
max_len = 1 # 记录最长的回文字串的长度
begin = 0 # 记录开始位置,到时候一加就可以找出字符串
# ababa
dp = [[False] * n for _ in range(n)] # 用于记录是否是回文字串
for i in range(n):
dp[i][i] = True # 自己到自己肯定是
for L in range(2, n + 1): # 这个是间隔,从2开始,
for i in range(n):
j = i + L - 1 # -1是从相邻的两个位置比较,【0,1】【1,2】【2,3】
if j >= n: # 超出字串串本身的长度,步子太大了,就跳出去
break
if s[i] != s[j]: # 如果不相等,返回false
dp[i][j] = False
else: # 如果相等,有两种情况
if j - i < 3: # 如果间隔中就一个或者批次挨着
dp[i][j] = True # 直接返回true就行
else: # 如果间隔中有2个及以上的字符
dp[i][j] = dp[i + 1][j - 1] # 就需要看dp[i+1][j-1]
if dp[i][j] and j - i + 1 > max_len: # 如果是回文字串,并且长度大于最大长度
max_len = j - i + 1 # 则进行更新
begin = i
return s[begin:begin + max_len]
if __name__ == '__main__':
s = Solution()
print(s.longestPalindrome('ababa'))