給定乙個字串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...