5. 最長迴文子串(動態規劃)

 5. 最長迴文子串

給定一個字符串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度爲 1000。

示例 1:

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

輸入: "cbbd"
輸出: "bb"

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/longest-palindromic-substring
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

 動態規劃

## 動態規劃原理

  • 基本思想:問題的最優解如果可以由子問題的最優解推導得到,則可以先求解子問題的最優解,在構造原問題的最優解;若子問題有較多的重複出現,則可以自底向上從最終子問題向原問題逐步求解。
  • 使用條件:可分爲多個相關子問題,子問題的解被重複使用
    • Optimal substructure(優化子結構):
      • 一個問題的優化解包含了子問題的優化解
      • 縮小子問題集合,只需那些優化問題中包含的子問題,降低實現複雜性
      • 我們可以自下而上的
    • Subteties(重疊子問題):在問題的求解過程中,很多子問題的解將被多次使用。
  • 動態規劃算法的設計步驟:
    • 分析優化解的結構
    • 遞歸地定義最優解的代價
    • 自底向上地計算優化解的代價保存之,並獲取構造最優解的信息
    • 根據構造最優解的信息構造優化解
  • 動態規劃特點:
    • 把原始問題劃分成一系列子問題;
    • 求解每個子問題僅一次,並將其結果保存在一個表中,以後用到時直接存取,不重複計算,節省計算時間
    • 自底向上地計算。
    • 整體問題最優解取決於子問題的最優解(狀態轉移方程)(將子問題稱爲狀態,最終狀態的求解歸結爲其他狀態的求解)

經典中的經典算法:動態規劃(詳細解釋,從入門到實踐,逐步講解)可以幫助理解

自己寫的,時間複雜度較小,空間複雜度較大。

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

中心拓展:

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章