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

LeetCode 1888: Minimum Number of Flips to Make the Binary String Alternating

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

基本資料
#

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

  • 提交紀錄:Wrong Answer → Accepted

解題思路
#

Type-1 操作(把開頭移到尾巴)做幾次都不用花錢,做完之後的字串一定是 s 的某個旋轉。所有旋轉都是 s + s 裡長度 n 的子字串,所以在 s + s 上滑動長度 n 的視窗。

每個視窗要變成交替字串,只有兩種目標:0101… 或 1010…。用絕對位置的奇偶性決定期望的字元,維護 diff = 視窗內跟 0101… 不同的數量。每個位置一定剛好跟其中一個目標不同,所以跟 1010… 不同的數量是 n - diff。

我的嘗試
#

第一版同時維護兩個計數,移出左邊元素時要用左邊那個位置的期望值判斷,但我複製貼上後用的還是右邊位置的 expected1、expected2。例如 s = "011":轉成 "101" 不用翻,答案是 0;這版回傳 1。

改用 expected1_left、expected2_left 就 AC 了。

正確解法
#

class Solution:
    def minFlips(self, s: str) -> int:
        n = len(s)
        t = s + s
        diff = 0                                   # 視窗內跟 0101... 不同的數量
        best = n
        for i, c in enumerate(t):
            diff += c != "01"[i % 2]
            if i >= n:
                diff -= t[i - n] != "01"[(i - n) % 2]   # 用左邊位置自己的期望值
            if i >= n - 1:
                best = min(best, diff, n - diff)
        return best

只維護一個計數,另一個用 n - diff 算,就不會有兩組變數複製貼上出錯的問題。

複雜度
#

時間 O(n),空間 O(n)(s + s;也可以用 i % n 省掉)。

要特別避免的錯誤
#

  • 移出元素時用了進來元素的期望值。
  • 只考慮 s 本身,沒考慮旋轉。

面試口說整理
#

把開頭移到尾巴不用花錢,所以任何旋轉都能免費得到,而所有旋轉都是 s + s 裡長度 n 的子字串。我在 s + s 上滑動長度 n 的視窗,用位置奇偶性維護跟 0101… 不同的數量,跟 1010… 不同的就是 n 減它,每個視窗取兩者較小值。時間 O(n)。

相關文章

LeetCode 3694: Distinct Points Reachable After Substring Removal
·1 分鐘
LeetCode Medium Sliding-Window Prefix-Sum Hash-Table String
LeetCode 3694 解題筆記:終點 = 全部的位移 − 被刪掉那段的位移;用長度 k 的視窗維護那段的位移,把每個終點放進 set
LeetCode 187: Repeated DNA Sequences
·1 分鐘
LeetCode Medium Hash-Table String Bit-Manipulation Sliding-Window
LeetCode 187 解題筆記:把每個長度 10 的子字串丟進雜湊表計數,出現超過一次的就是答案
LeetCode 647: Palindromic Substrings
·1 分鐘
LeetCode Medium Two-Pointers String Dynamic-Programming
LeetCode 647 解題筆記:中心擴展,每擴展成功一次就是一個回文子字串
LeetCode 131: Palindrome Partitioning
·1 分鐘
LeetCode Medium String Dynamic-Programming Backtracking
LeetCode 131 解題筆記:每一層從剩下字串的開頭切出一段回文,切的長度從 1 到整段都要試
LeetCode 424: Longest Repeating Character Replacement
·1 分鐘
LeetCode Medium Hash-Table String Sliding-Window
LeetCode 424 解題筆記:可變長度滑動視窗,視窗長度減掉最多的字元次數就是要替換的數量,超過 k 就縮左邊
LeetCode 5: Longest Palindromic Substring
·1 分鐘
LeetCode Medium Two-Pointers String Dynamic-Programming Manacher
LeetCode 5 解題筆記:中心擴展,每個位置當奇數和偶數長度的中心往外擴;區間 DP 的話 i 要從大到小