SpringBoot如何使用WebSocket實現前後端互動
阿新 • • 發佈:2022-04-01
題目描述
給你一個字串 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\)
- 邊界條件:\(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]