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

LeetCode 1234: Replace the Substring for Balanced String

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

基本資料
#

難易度: medium 第一次嘗試:2026-01-18

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

解題思路
#

替換視窗裡的字元時,視窗外面的字元不能動。要讓整個字串平衡,視窗外的每種字元都必須 <= n / 4(多出來的才有辦法在視窗裡補成其他字元)。

反過來,只要視窗外每種都 <= n / 4,就一定能把視窗填成平衡的樣子。所以:

  • 維護 outside[c] = 視窗外的數量。
  • 用「求最短」的滑動視窗:右端加入(outside 減一),合法時更新答案,再試著縮左邊(outside 加一)。

一開始就平衡時答案是 0。

我的解法
#

class Solution:
    def balancedString(self, s: str) -> int:
        n = len(s)
        target = n // 4
        outside = Counter(s)                       # 視窗外的數量
        if all(outside[c] <= target for c in "QWER"):
            return 0

        left = 0
        best = n
        for right, c in enumerate(s):
            outside[c] -= 1
            while left <= right and all(outside[ch] <= target for ch in "QWER"):
                best = min(best, right - left + 1)
                outside[s[left]] += 1
                left += 1
        return best

我原本的寫法是先算出每種字元多了幾個,視窗裡要包含這些多出來的字元,用 meet_count 記錄有幾種已經包含夠了。意思一樣,但「視窗外不能超過 n / 4」的寫法比較短。

複雜度
#

時間 O(n)(每次檢查 4 種字元),空間 O(1)。

要特別避免的錯誤
#

  • 一開始就平衡時要回傳 0。
  • 合法條件看的是視窗外,不是視窗內。

面試口說整理
#

替換一段時,視窗外的字元不能動,所以整個字串能變平衡,等價於視窗外每種字元都不超過 n / 4。我維護視窗外的數量,用求最短的滑動視窗,合法時更新答案再縮左邊。一開始就平衡就回傳 0。時間 O(n)。

相關文章

LeetCode 2730: Find the Longest Semi-Repetitive Substring
·1 分鐘
LeetCode Medium Sliding-Window String
LeetCode 2730 解題筆記:視窗裡最多一組相鄰相同的數字;新的一組進來就縮左邊,直到移出前一組
LeetCode 1208: Get Equal Substrings Within Budget
·1 分鐘
LeetCode Medium Sliding-Window String Binary-Search Prefix-Sum
LeetCode 1208 解題筆記:每個位置的花費是 |s[i] - t[i]|,題目變成「總和 <= maxCost 的最長子陣列」
LeetCode 2024: Maximize the Confusion of an Exam
·1 分鐘
LeetCode Medium Sliding-Window String Binary-Search Prefix-Sum
LeetCode 2024 解題筆記:視窗合法的條件是 T 和 F 比較少的那個 <= k(把少的全部改掉);不合法就縮左邊
LeetCode 2904: Shortest and Lexicographically Smallest Beautiful String
·1 分鐘
LeetCode Medium Sliding-Window String
LeetCode 2904 解題筆記:視窗裡剛好 k 個 1 時,把左邊的 0 也縮掉,得到以 right 結尾最短的美麗子字串;先比長度再比字典序
LeetCode 395: Longest Substring with At Least K Repeating Characters
·2 分鐘
LeetCode Medium Sliding-Window Divide-and-Conquer Hash-Table String
LeetCode 395 解題筆記:「每個字元至少 k 次」不單調,不能直接滑動;分治法用出現不到 k 次的字元切開,或枚舉視窗裡有幾種字元,固定種類數後就能滑動
LeetCode 2516: Take K of Each Character From Left and Right
·1 分鐘
LeetCode Medium Sliding-Window Hash-Table String
LeetCode 2516 解題筆記:從兩端拿等於中間留一段;留下的每種字元最多是總數 − k,找最長的這種中間視窗