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

LeetCode 925: Long Pressed Name

·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

  • 提交紀錄:Runtime Error ×2 → Internal Error → Wrong Answer ×5 → Accepted

解題思路
#

兩個字串各一個指標(Two Pointers 模板二),以 typed 為主迴圈:

  • typed[j] 等於 name[i]:配對成功,i 往前。
  • 否則它必須是長按,也就是 typed[j] == typed[j - 1];不是的話就失敗。

最後還要檢查 i 有沒有走完 name,避免 typed 只打了 name 的前半段。

我的嘗試
#

這題提交了 9 次。中間幾版的迴圈條件是兩個指標都沒走完才繼續,不相同時先 i += 1 再比 name[i]:

  • i 加一之後沒檢查是否超出範圍,例如 name = "b"、typed = "a" 直接 IndexError。
  • 迴圈在 name 走完時就停了,typed 剩下的字元完全沒檢查。

最後改成以 typed 為主迴圈、每個字元都要嘛配對、要嘛是長按,才 AC。

正確解法
#

class Solution:
    def isLongPressedName(self, name: str, typed: str) -> bool:
        i = 0
        for j in range(len(typed)):
            if i < len(name) and name[i] == typed[j]:
                i += 1
            elif j == 0 or typed[j] != typed[j - 1]:
                return False
        return i == len(name)

複雜度
#

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

要特別避免的錯誤
#

  • 以 typed 為主迴圈,typed 裡多出來的字元都要檢查。
  • 最後要確認 name 全部對到了。

面試口說整理
#

我用兩個指標,以 typed 為主:字元等於 name 目前的字就一起往前,不然它必須跟 typed 前一個字一樣(長按),否則失敗;最後確認 name 全部配對完。時間 O(n + m)、空間 O(1)。

相關文章

LeetCode 917: Reverse Only Letters
·1 分鐘
LeetCode Easy Two-Pointers String
LeetCode 917 解題筆記:左右指針各自跳過非字母,兩邊都是字母時交換;字串要先轉成 list 才能改
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 個時全部反轉,切片會自動處理