leetcode 5 最長回文子串

2021-10-08 05:54:57 字數 2111 閱讀 7416

給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為 1000。

示例 1:

輸入:"babad"輸出:"bab"注意:"aba" 也是乙個有效答案。
示例 2:

輸入:"cbbd"輸出:"bb"
class solution(object):

def longestpalindrome(self, s):

""":type s: str

:rtype: str

"""n = len(s)

dp = [[false] * n for _ in range(n)]

longest = ''

for l in range(n):

for i in range(n):

j = i + l

if j > n-1:

break

if l == 0:

dp[i][j] = true

elif l == 1:

dp[i][j] = s[i] == s[j]

else:

dp[i][j] = (dp[i+1][j-1] and s[i] == s[j])

if dp[i][j] and l + 1 > len(longest):

longest = s[i:j+1]

return longest

對於字串"aba"而言,因為它是回文串,那麼"babab"也一定是回文串,因為它們中間是個回文串,且首尾字元相同。根據這樣的思想我們可以用動態規劃來解題。

我們用p(i,j)來表示字串 s 的第 i 個位置到第 j 個位置組成的字串是否為回文串。p(i,j) = true表示是回文串, false表示不是。

那麼我們可以很容易的推導出狀態轉移方程:

然後我們需要討論一下邊界情況,就是字串長度為1或者2。如果長度為1那麼它顯然就是乙個回文串,而如果長度為2那麼只要兩個字元相等即可。

至此我們就完成來動態規劃的部分,現在問題是如何遍歷出所有的子串。我們可以另兩端點的距離(串長-1)分別從0到n-1遍歷,然後遍歷選擇每個起點就能完成整個步驟。

class solution:

def expandaroundcenter(self, s, left, right):

while left >= 0 and right < len(s) and s[left] == s[right]:

left -= 1

right += 1

return left + 1, right - 1

def longestpalindrome(self, s: str) -> str:

start, end = 0, 0

for i in range(len(s)):

left1, right1 = self.expandaroundcenter(s, i, i)

left2, right2 = self.expandaroundcenter(s, i, i + 1)

if right1 - left1 > end - start:

start, end = left1, right1

if right2 - left2 > end - start:

start, end = left2, right2

return s[start: end + 1]

其實我們也可以從邊界條件開始出發思考問題。我們可以先找到該字串所有的回文串中心,然後向兩邊開始擴張。比如s[i] 只有乙個字元,那麼它必然是個回文串,然後我們向兩邊擴散,去判斷s[i-1,i+1]是否為回文串。對於回文串來講邊界情況有兩種,一種長度為1那麼它必為回文串,另一種長度為2,那麼如果兩個字元相等則為回文串。我們找到所有的回文串中心,然後開始向兩邊擴張,直到新子串的首尾不相同,即找到對於這個回文中心最長的長度。

LeetCode5最長回文子串

給定乙個字串s,找到s中最長的回文子串。你可以假設s長度最長為1000。示例 輸入 babad 輸出 bab 注意 aba 也是有效答案示例 輸入 cbbd 輸出 bb 動態規劃來做,每個回文字串的子字串也是回文字串,即string是回文字串那麼它的string.substring 1,lenth ...

LeetCode 5 最長回文子串

問題描述 給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 解決方案 中心擴充套件演算法 事實上,只需使用恆定的空間,我們就可以在 o n 2 的時間內解決這個問題...

leetcode5 最長回文子串

遞推式 1 一般 s i 1 s j 1 and j i and j i len s i 1,j 1 2 初始化dp矩陣對角線的值為 true,相鄰兩個元素相等時dp i i 1 為true 初始化回文串起始位置和長度。def longestpalindrome s n len s if s ret...