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

LeetCode 2730: Find the Longest Semi-Repetitive Substring

·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-11

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

解題思路
#

視窗合法 ⇔ 視窗裡最多一組相鄰相同的數字(s[i] == s[i + 1])。

  • 右邊界加入 s[right] 時,如果 s[right] == s[right - 1],相鄰相同的組數 +1。
  • 超過 1 組就縮左邊。左邊界移出 s[left] 時,如果 s[left] == s[left + 1],那一組也跟著離開,組數 -1。

我的解法
#

class Solution:
    def longestSemiRepetitiveSubstring(self, s: str) -> int:
        left = pairs = best = 0
        for right in range(len(s)):
            if right > 0 and s[right] == s[right - 1]:
                pairs += 1
            while pairs > 1:
                if s[left] == s[left + 1]:
                    pairs -= 1                     # 這一組離開視窗
                left += 1
            best = max(best, right - left + 1)
        return best

pairs > 1 時視窗裡至少有兩組,left + 1 <= right,所以 s[left + 1] 不會越界。

複雜度
#

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

要特別避免的錯誤
#

  • 移出左邊時,要看的是 s[left] 和 s[left + 1] 這一組,不是 s[left - 1]。

面試口說整理
#

視窗裡最多一組相鄰相同的數字。右邊加入時跟前一個字元相同就加一組,超過一組就縮左邊,左邊移出時如果它跟下一個相同,那一組就離開了。記錄最長長度,時間 O(n)。

相關文章

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 2516: Take K of Each Character From Left and Right
·1 分鐘
LeetCode Medium Sliding-Window Hash-Table String
LeetCode 2516 解題筆記:從兩端拿等於中間留一段;留下的每種字元最多是總數 − k,找最長的這種中間視窗
LeetCode 1016: Binary String With Substrings Representing 1 To N
·2 分鐘
LeetCode Medium Sliding-Window String Bit-Manipulation Hash-Table
LeetCode 1016 解題筆記:s 最多 1000 個字元,長度固定時的子字串數量有限,n 太大一定是 False;從 n 往下檢查會很快失敗,或從每個起點往右最多延伸 30 位收集所有 <= n 的值
LeetCode 1888: Minimum Number of Flips to Make the Binary String Alternating
·1 分鐘
LeetCode Medium Sliding-Window String Dynamic-Programming
LeetCode 1888 解題筆記:把移到尾巴的操作變成在 s + s 上滑動長度 n 的視窗;視窗跟 0101… 不同的數量是 diff,跟 1010… 不同的就是 n - diff
LeetCode 3694: Distinct Points Reachable After Substring Removal
·1 分鐘
LeetCode Medium Sliding-Window Prefix-Sum Hash-Table String
LeetCode 3694 解題筆記:終點 = 全部的位移 − 被刪掉那段的位移;用長度 k 的視窗維護那段的位移,把每個終點放進 set