↓快轉到主要內容
  1. LeetCode/

LeetCode 5: Longest Palindromic Substring

·1 分鐘· ·
LeetCode Medium Two-Pointers String Dynamic-Programming Manacher
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2022-10-20

  • 提交紀錄:Accepted ×3 → Runtime Error → Accepted ×2 → Wrong Answer → Runtime Error → Wrong Answer → Accepted ×4 → Wrong Answer → Accepted

解題思路
#

中心擴展:回文以某個中心對稱,中心可以是一個字元(奇數長度)或兩個字元之間(偶數長度),共 2n - 1 個。每個中心往外擴到不對稱為止,記錄最長的,O(n²) 時間、O(1) 空間。

區間 DP(Interval DP):dp[i][j] = s[i] == s[j] and dp[i + 1][j - 1],因為依賴 i + 1,i 要從大到小算。

我的嘗試
#

這題 2022 年和 2026 年都寫過:

  • 2022-11-15 重寫中心擴展時,第一版 helper 回傳的是長度,最後也回傳長度;改成回傳子字串之後,又把 res = longest(整數)寫成了答案,應該是 res = length(子字串)。
  • 2026-08 練區間 DP,有一版外層 i 從小到大,dp[i + 1][j - 1] 還沒算就被拿來用,結果錯了;改回 i 從大到小就 AC 了。

正確解法
#

class Solution:
    def longestPalindrome(self, s: str) -> str:
        def expand(l, r):
            while l >= 0 and r < len(s) and s[l] == s[r]:
                l, r = l - 1, r + 1
            return l + 1, r
        best = (0, 1)
        for i in range(len(s)):
            for l, r in (expand(i, i), expand(i, i + 1)):
                if r - l > best[1] - best[0]:
                    best = (l, r)
        return s[best[0]:best[1]]

複雜度
#

時間 O(n²),空間 O(1)。

要特別避免的錯誤
#

  • 偶數長度的中心也要試。
  • 回傳子字串,不是長度。
  • 區間 DP 依賴 dp[i + 1][j - 1],i 要倒著算。

面試口說整理
#

我用中心擴展,每個字元和每兩個字元之間都當成中心往外擴,記錄最長的回文。時間 O(n²)、空間 O(1)。如果用區間 DP,dp[i][j] 依賴 dp[i + 1][j - 1],i 要從後往前算。

相關文章

LeetCode 392: Is Subsequence
·1 分鐘
LeetCode Easy Two-Pointers String Dynamic-Programming
LeetCode 392 解題筆記:兩個指針,t 的指針一直往前,對上 s 的字元時 s 的指針也前進;兩邊的邊界都要檢查
LeetCode 11: Container With Most Water
·1 分鐘
LeetCode Medium Array Two-Pointers Greedy
LeetCode 11 解題筆記:左右指針從兩端開始,每次移動比較矮的那一邊;移動高的那邊只會讓寬度變小、高度不會變高
LeetCode 15: 3Sum
·2 分鐘
LeetCode Medium Array Two-Pointers Sorting
LeetCode 15 解題筆記:排序後固定第一個數,剩下用對撞指針找兩數和;三個位置都要跳過相同的值,才不會有重複的組合
LeetCode 16: 3Sum Closest
·1 分鐘
LeetCode Medium Array Two-Pointers Sorting
LeetCode 16 解題筆記:排序後固定一個數,對撞指針找另外兩個;比較的是和跟 target 的距離 abs(sum - target)
LeetCode 17: Letter Combinations of a Phone Number
·1 分鐘
LeetCode Medium Hash-Table String Backtracking
LeetCode 17 解題筆記:每一層處理一個數字,枚舉它對應的字母;空字串要回傳空 list
LeetCode 18: 4Sum
·1 分鐘
LeetCode Medium Array Two-Pointers Sorting
LeetCode 18 解題筆記:排序後兩層迴圈固定前兩個數,剩下用對撞指針;四個位置都要跳過相同的值