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

LeetCode 917: Reverse Only Letters

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

基本資料
#

難易度: easy 第一次嘗試:2022-09-25

  • 提交紀錄:Wrong Answer → Runtime Error ×3 → Time Limit Exceeded ×2 → Wrong Answer ×2 → Runtime Error → Wrong Answer → Runtime Error → Wrong Answer ×9 → Runtime Error → Wrong Answer → Accepted → Wrong Answer ×2 → Accepted ×2

解題思路
#

跟 LC 125 一樣的左右指針(Two Pointers 模板一):左邊不是字母就右移、右邊不是字母就左移,兩邊都是字母才交換。Python 字串不可變,先轉成 list,最後 join。

我的嘗試
#

這題提交了 27 次,是這批最多的:

  • 第一版兩個指標都從 0 開始(i = j = 0),迴圈根本沒有執行,也直接對字串交換字元。
  • 之後試了很多種「先把字母存起來再填回去」的寫法,邊界一直出錯:單一字元 "z" 回傳空字串或 "zz","a7" 少了字母只剩 "7"。
  • 2026 年重寫成左右指針才一次寫對。

正確解法
#

class Solution:
    def reverseOnlyLetters(self, s: str) -> str:
        a = list(s)
        l, r = 0, len(a) - 1
        while l < r:
            if not a[l].isalpha():
                l += 1
            elif not a[r].isalpha():
                r -= 1
            else:
                a[l], a[r] = a[r], a[l]
                l, r = l + 1, r - 1
        return "".join(a)

複雜度
#

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

要特別避免的錯誤
#

  • 字串不能原地改,要轉成 list。
  • 兩個指標一開始一個在頭、一個在尾。

面試口說整理
#

我把字串轉成 list,用左右指針各自跳過非字母,兩邊都是字母時交換再往中間走,最後接回字串。時間 O(n)。

相關文章

LeetCode 925: Long Pressed Name
·1 分鐘
LeetCode Easy Two-Pointers String
LeetCode 925 解題筆記:兩個指標分別走 name 和 typed,typed 的字元要嘛對到 name 的下一個字,要嘛是前一個字的長按
LeetCode 821: Shortest Distance to a Character
·1 分鐘
LeetCode Easy Array Two-Pointers String
LeetCode 821 解題筆記:左往右掃一次記錄到左邊最近的 c 的距離,右往左再掃一次取較小值
LeetCode 844: Backspace String Compare
·1 分鐘
LeetCode Easy Two-Pointers String Stack Simulation
LeetCode 844 解題筆記:用 stack 模擬退格;O(1) 空間的話從尾巴往前,遇到 # 就記下要跳過幾個字元
LeetCode 680: Valid Palindrome II
·1 分鐘
LeetCode Easy Two-Pointers String Greedy
LeetCode 680 解題筆記:左右指針遇到第一對不同時,只有兩種刪法:刪左邊或刪右邊,檢查剩下的是否為回文
LeetCode 696: Count Binary Substrings
·1 分鐘
LeetCode Easy Two-Pointers String
LeetCode 696 解題筆記:把字串切成連續相同字元的段,相鄰兩段可以組出 min(前一段, 這一段) 個子字串
LeetCode 541: Reverse String II
·1 分鐘
LeetCode Easy Two-Pointers String
LeetCode 541 解題筆記:每 2k 個為一段,反轉每段的前 k 個;最後一段不足 k 個時全部反轉,切片會自動處理