1. 程式人生 > 其它 >Direct3D11學習:(九)繪製基本幾何體

Direct3D11學習:(九)繪製基本幾何體

題目描述

給你一個字串 s,找到 s 中最長的迴文子串。

示例

 輸入:s = "babad"
 輸出:"bab"
 解釋:"aba" 同樣是符合題意的答案。

動態規劃

對於一個子串而言,如果它是迴文串,並且長度大於 2,那麼將它首尾的兩個字母去除之後,它仍然是個迴文串。例如對於字串 “ababa”,如果我們已經知道"bab" 是迴文串,那麼 "ababa" 一定是迴文串,這是因為它的首尾兩個字母都是"a"。

  • 狀態定義:dp[i][j]表示s[i...j]是否為迴文串
  • 轉移方程:$dp[i][j] = dp[i+1][j-1] $ and \(s[i]==s[j]\)
  • 初始化: \(dp[i][i]=True\)
    , 對角元素為True
  • 邊界條件:\(j-i<3,dp[i][j] = True\) $(s[i]=s[j]) $

dp[i][j]填表

按列從左至右,自上而下

注:由於$dp[i][j]$依賴於$dp[i+1][j-1]$,故需要按列填表。

程式碼實現

class Solution:
    def longestPalindrome(self, s: str) -> str:
        '''動態規劃
        dp[i][j]表示s[i....j]為迴文子串
        dp[i][j] = dp[i+1][j-1] and s[i]==s[j]
        '''
        n = len(s)
        dp = [[False]*n for _ in range(n)]
        if n<2:
            return s 
        # dp初始化
        for i in range(n):
            dp[i][i] = True

        max_sub_str = 1
        begin = 0

        for j in range(1,n):
            for i in range(0,j):

                if s[i]==s[j]:
                    # 邊界條件
                    if j-i<3:
                        dp[i][j]=True
                    else:
                        dp[i][j] = dp[i+1][j-1]
                else:
                    dp[i][j] = False

                len_sub_str = j-i+1
                # 記錄最大回文子串
                if dp[i][j] and len_sub_str > max_sub_str:
                    max_sub_str = len_sub_str
                    begin = i

        end = begin+max_sub_str
        return s[begin:end]

參考