給定一個字符串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度爲 1000。
示例 1:
輸入: "babad"
輸出: "bab"
注意: "aba" 也是一個有效答案。
示例 2:
輸入: "cbbd"
輸出: "bb"
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
動態規劃
## 動態規劃原理
- 基本思想:問題的最優解如果可以由子問題的最優解推導得到,則可以先求解子問題的最優解,在構造原問題的最優解;若子問題有較多的重複出現,則可以自底向上從最終子問題向原問題逐步求解。
- 使用條件:可分爲多個相關子問題,子問題的解被重複使用
- Optimal substructure(優化子結構):
- 一個問題的優化解包含了子問題的優化解
- 縮小子問題集合,只需那些優化問題中包含的子問題,降低實現複雜性
- 我們可以自下而上的
- Subteties(重疊子問題):在問題的求解過程中,很多子問題的解將被多次使用。
- Optimal substructure(優化子結構):
- 動態規劃算法的設計步驟:
- 分析優化解的結構
- 遞歸地定義最優解的代價
- 自底向上地計算優化解的代價保存之,並獲取構造最優解的信息
- 根據構造最優解的信息構造優化解
- 動態規劃特點:
- 把原始問題劃分成一系列子問題;
- 求解每個子問題僅一次,並將其結果保存在一個表中,以後用到時直接存取,不重複計算,節省計算時間
- 自底向上地計算。
- 整體問題最優解取決於子問題的最優解(狀態轉移方程)(將子問題稱爲狀態,最終狀態的求解歸結爲其他狀態的求解)
經典中的經典算法:動態規劃(詳細解釋,從入門到實踐,逐步講解)可以幫助理解
自己寫的,時間複雜度較小,空間複雜度較大。
class Solution:
def longestPalindrome(self, s: str) -> str:
l = len(s)
lmax=0
maxS=""
for k in range(l):
i=j=k
while (i >= 0 and j < l and s[i] == s[j]):
#print(i,j)
i -= 1
j += 1
if j-i-1 > lmax:
lmax = j-i-1
maxS = s[i+1:j]
if l >=2:
kleft = 0
kright = 1
else:
kleft = kright =0
temp = 0
for k in range(l):
if (kright < l and s[kleft] == s[kright]):
i = kleft
j = kright
while i >= 0 and j < l and s[i] == s[j]:
i -= 1
j += 1
if j-i-1 > lmax:
lmax = j-i-1
maxS = s[i+1:j]
kleft += 1
kright += 1
return maxS
中心拓展: