LeetCode 最長迴文子串

給定一個字符串 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

  • dp[i][i]=1
  • dp[i][i+1]=1 if str[i]==str[i+1]

      上式的意義是單個字符,兩個相同字符都是迴文串。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]
相關文章
相關標籤/搜索