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

LeetCode 763: Partition Labels

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

基本資料
#

難易度: medium 第一次嘗試:2026-11-03

  • 提交紀錄:Accepted(一次通過)

解題思路
#

同一個字母只能出現在一段裡,所以一段的結尾,至少要到段內每個字母最後一次出現的位置(Greedy):

  1. 先掃一遍,記下每個字母最後出現的位置 last。
  2. 再掃一遍,維護目前這段的結尾 end = max(end, last[c])。
  3. 走到 i == end:段內所有字母都不會再出現,可以切。

每段都在最早能切的地方切,段數就最多。

我的嘗試
#

一次通過。我的寫法是在下一個 i 超過 end 時才切,迴圈結束後再補最後一段。下面改成在 i == end 當下就切,不用另外補最後一段。

正確解法
#

class Solution:
    def partitionLabels(self, s: str) -> List[int]:
        last = {c: i for i, c in enumerate(s)}
        res = []
        start = end = 0
        for i, c in enumerate(s):
            end = max(end, last[c])
            if i == end:              # 段內的字母後面都不會再出現
                res.append(end - start + 1)
                start = i + 1
        return res

複雜度
#

時間 O(n),空間 O(1)(最多 26 個字母)。

要特別避免的錯誤
#

  • 用第一次出現的位置:決定能不能切的是字母最後出現在哪裡。
  • 只看目前字母的 last[c] 判斷能不能切:要用整段累積的 end,不然前面字母的結尾會被忽略。

面試口說整理
#

同一個字母只能在一段裡,所以我先記下每個字母最後出現的位置。接著掃描字串,把目前這段的結尾延伸到段內字母最後出現位置的最大值;走到結尾時,段內的字母後面都不會再出現,就在這裡切。每段都盡早切,段數就最多。時間 O(n),空間 O(1)。

相關文章

LeetCode 4026: Maximum Gap Between Stations
·2 分鐘
LeetCode Medium Two-Pointers Greedy String
LeetCode 4026 解題筆記:從左邊貪心配出每個工人最早可用的站、從右邊配出最晚可用的站;在第 i 和 i+1 個工人之間切開,最大間隔是 latest[i+1] - earliest[i]
LeetCode 244: Shortest Word Distance II
·1 分鐘
LeetCode Medium Two-Pointers Design Hash-Table String Array
LeetCode 244 解題筆記:預處理每個字的出現位置(天然排序),查詢時對兩個位置列表做雙指針合併,每次移動比較小的那個
LeetCode 1616: Split Two Strings to Make Palindrome
·2 分鐘
LeetCode Medium Two-Pointers String Greedy
LeetCode 1616 解題筆記:外側用 a 的前綴配 b 的後綴貪心比對,配不下去時,剩下的中間段必須整段在 a 或 b 裡是回文;兩個方向都要檢查
LeetCode 2131: Longest Palindrome by Concatenating Two Letter Words
·1 分鐘
LeetCode Medium Greedy Hash-Table String Counting
LeetCode 2131 解題筆記:每個字跟它的反轉配成一對放兩邊;本身是回文的字也能兩兩配對,只有剩下的一個能放正中間
LeetCode 522: Longest Uncommon Subsequence II
·1 分鐘
LeetCode Medium Two-Pointers String Sorting Array Hash-Table
LeetCode 522 解題筆記:最長的特殊子序列一定是某個完整字串;依長度由長到短檢查,只要不是其他夠長字串的子序列就是答案
LeetCode 4019: Merge Close Characters II
·1 分鐘
LeetCode Medium Hash-Table String
LeetCode 4019 解題筆記:留下來的字不會再變,記每種字元在結果裡最後的位置;新字元跟它的距離 <= k 就被合併掉