給定一個字符串 s,找到 s 中最長的迴文子串。你能夠假設 s 的最大長度爲1000。數組
示例 1:spa
輸入: "babad"
輸出: "bab"
注意: "aba"也是一個有效答案。
示例 2:code
輸入: "cbbd"
輸出: "bb"
方法一 動態規劃:blog
對於字符串str,假設dp[i,j]=1表示str[i...j]是迴文子串,那個一定存在dp[i+1,j-1]=1。這樣最長迴文子串就能分解成一系列子問題,能夠利用動態規劃求解了。首先構造狀態轉移方程字符串
上面的狀態轉移方程表示,當str[i]=str[j]時,若是str[i+1...j-1]是迴文串,則str[i...j]也是迴文串;若是str[i+1...j-1]不是迴文串,則str[i...j]不是迴文串。io
初始狀態class
上式的意義是單個字符,兩個相同字符都是迴文串。bfc
咱們只須要數組的右上部分,首先將數組初始化爲全0數組 arr = [[0 for col in range(l)] for row in range(l)]object
注意計算順序爲斜向計算方法
例如:綠色爲初始化順序,紅色爲計算順序
1 class Solution(object): 2 def longestPalindrome(self, s): 3 """ 4 :type s: str 5 :rtype: str 6 """ 7 l = len(s) 8 start = 0 9 longest = 1 10 arr = [[0 for col in range(l)] for row in range(l)] # 數組初始化 11 # l * l arr[i][j]表示i-j是否爲迴文串, 數組只使用右上部分 12 # 首先,全部的單個字符均爲迴文串 13 for i in range(l): 14 arr[i][i] = 1 15 # 其次,兩個字符的 16 for i in range(l-1): 17 if s[i] == s[i+1]: 18 arr[i][i+1] = 1 19 start, longest = i, 2 20 21 for i in range(3, l+1):# 迴文串的長度 22 for j in range(l-i+1): 23 # [j][j+l-1] 24 if s[j] == s[j+i-1] and arr[j+1][j+i-2] == 1: 25 arr[j][j+i-1] = 1 26 start, longest = j, i 27 28 29 return s[start:start+longest]