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

LeetCode 777: Swap Adjacent in LR String

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

基本資料
#

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

  • 提交紀錄:Wrong Answer ×2 → Accepted

解題思路
#

把操作翻譯一下:

  • "XL" → "LX":L 往左移一格。
  • "RX" → "XR":R 往右移一格。

X 就是空格,L 和 R 不能互相穿越,所以這題跟 LeetCode 2337 完全一樣:

  1. 拿掉 X 後,start 和 result 的序列要一樣。
  2. 每顆 L 在 start 的位置 >= 在 result 的位置;每顆 R 要 <=。

我的嘗試
#

  1. 第一版只比較 Counter(start) == Counter(result)。例如 start = "LR"、result = "RL":字元數量一樣,但 L、R 不能互相穿越,答案是 False,這版回傳 True。
  2. 第二版改成雙指針跳過 X、比對順序,但沒檢查方向。例如 start = "LX"、result = "XL":順序一樣,但 L 要往右移才能到位,答案是 False,這版回傳 True。

補上方向檢查就 AC 了。

正確解法
#

class Solution:
    def canTransform(self, start: str, result: str) -> bool:
        n = len(start)
        i = j = 0
        while True:
            while i < n and start[i] == "X":
                i += 1
            while j < n and result[j] == "X":
                j += 1
            if i == n or j == n:
                return i == n and j == n
            if start[i] != result[j]:
                return False
            if start[i] == "L" and i < j:
                return False                      # L 只能往左
            if start[i] == "R" and i > j:
                return False                      # R 只能往右
            i += 1
            j += 1

複雜度
#

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

要特別避免的錯誤
#

  • 只比較字元數量。
  • 只比對順序,忘了 L 只能往左、R 只能往右。

面試口說整理
#

XL 換成 LX 是 L 往左走,RX 換成 XR 是 R 往右走,X 就是空格,棋子不能互相穿越。所以我用兩個指針跳過 X,配對第 k 顆棋子:種類一樣,L 在 start 不能比 result 左邊,R 不能比 result 右邊,最後兩邊同時走完。時間 O(n)。

相關文章

LeetCode 2337: Move Pieces to Obtain a String
·1 分鐘
LeetCode Medium Two-Pointers String
LeetCode 2337 解題筆記:跳過空格後兩邊的棋子順序必須一樣;L 只能往左、R 只能往右,所以每顆 L 在 start 的位置要 >= target,R 要 <=
LeetCode 809: Expressive Words
·2 分鐘
LeetCode Medium Two-Pointers String Array
LeetCode 809 解題筆記:兩個指針一段一段比對連續相同字元的長度;長度不同時,s 的那段必須至少 3 個且不少於 word;最後兩個字串都要剛好走完
LeetCode 1616: Split Two Strings to Make Palindrome
·2 分鐘
LeetCode Medium Two-Pointers String Greedy
LeetCode 1616 解題筆記:外側用 a 的前綴配 b 的後綴貪心比對,配不下去時,剩下的中間段必須整段在 a 或 b 裡是回文;兩個方向都要檢查
LeetCode 1750: Minimum Length of String After Deleting Similar Ends
·1 分鐘
LeetCode Medium Two-Pointers String
LeetCode 1750 解題筆記:兩端字元相同時,各自把同一段相同字元全部吃掉;整段都是同一個字元時可以刪光
LeetCode 151: Reverse Words in a String
·1 分鐘
LeetCode Medium Two-Pointers String
LeetCode 151 解題筆記:split() 不帶參數會把連續空白當成一個分隔,也會去掉頭尾空白;反轉後用一個空白接起來
LeetCode 647: Palindromic Substrings
·1 分鐘
LeetCode Medium Two-Pointers String Dynamic-Programming
LeetCode 647 解題筆記:中心擴展,每擴展成功一次就是一個回文子字串