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

LeetCode 1147: Longest Chunked Palindrome Decomposition

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

基本資料
#

難易度: hard 第一次嘗試:2026-07-01

  • 提交紀錄:Accepted ×2(2026-07-01、08-24 各寫一次)

解題思路
#

貪心:左右兩端一出現相同的前綴和後綴就切。

為什麼越早切越好:如果最短的相同前後綴是 A,而某個更長的相同前後綴 B 被選成一塊,那 B 的開頭和結尾都是 A,可以把 B 再拆成 A + 中間 + A,塊數只會更多。

做法:兩個指針從兩端往內,左邊累積 left_str、右邊往前累積 right_str,相等就塊數 +2、清空重來。最後:

  • 兩個指針剛好碰在同一個字元上(奇數長度的中心),或
  • 還有沒配對完的字串,

中間那段算一塊,+1。

我的解法
#

class Solution:
    def longestDecomposition(self, text: str) -> int:
        left, right = 0, len(text) - 1
        left_str = right_str = ""
        chunks = 0
        while left < right:
            left_str += text[left]
            right_str = text[right] + right_str
            if left_str == right_str:              # 能切就切
                chunks += 2
                left_str = right_str = ""
            left += 1
            right -= 1
        if left == right or left_str:              # 中間剩下的算一塊
            chunks += 1
        return chunks

複雜度
#

時間 O(n^2)(每次比較字串最多 O(n)),n <= 1000。用滾動雜湊比較可以做到 O(n)。空間 O(n)。

要特別避免的錯誤
#

  • 最後中間剩下的部分要算一塊。
  • 右邊的字串要往前面接(text[right] + right_str),順序才會跟原字串一樣。

面試口說整理
#

我用貪心,從兩端同時往內累積字串,左右一相等就切成一對,因為更長的相同前後綴一定可以再拆成更短的,塊數只會更多。最後如果中間還有剩,就算一塊。時間 O(n^2),用滾動雜湊可以到 O(n)。

相關文章

LeetCode 1537: Get the Maximum Score
·2 分鐘
LeetCode Hard Dynamic-Programming Two-Pointers Greedy Array
LeetCode 1537 解題筆記:兩個排序陣列只在共同的值可以換路;雙指針合併,兩條路各自累加,遇到共同的值時兩邊都取較大的那個再加上它
LeetCode 3952: Maximum Total Value of Covered Indices
·1 分鐘
LeetCode Medium Dynamic-Programming State-Machine Greedy String
LeetCode 3952 解題筆記:每個代幣只能往左移一格,狀態是「這格的代幣有沒有往左移」;往左移只有在左邊那格原本沒被蓋住時才有用
LeetCode 2697: Lexicographically Smallest Palindrome
·1 分鐘
LeetCode Easy Two-Pointers String Greedy
LeetCode 2697 解題筆記:對撞指針,兩端不同時都改成比較小的那個字元
LeetCode 1745: Palindrome Partitioning IV
·1 分鐘
LeetCode Hard Dynamic-Programming Interval-Dp String
LeetCode 1745 解題筆記:先用區間 DP 建好 is_pal[i][j],再枚舉兩個切點,三段都是回文就成立,O(n^2)
LeetCode 1793: Maximum Score of a Good Subarray
·1 分鐘
LeetCode Hard Two-Pointers Greedy Binary-Search Array Monotonic-Stack
LeetCode 1793 解題筆記:從 k 往兩邊擴張,每次往鄰居比較大的那一邊走,讓每個長度的最小值盡量大;到邊界時只能往另一邊
LeetCode 1616: Split Two Strings to Make Palindrome
·2 分鐘
LeetCode Medium Two-Pointers String Greedy
LeetCode 1616 解題筆記:外側用 a 的前綴配 b 的後綴貪心比對,配不下去時,剩下的中間段必須整段在 a 或 b 裡是回文;兩個方向都要檢查