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

LeetCode 3121: Count the Number of Special Characters II

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

基本資料
#

難易度: medium 第一次嘗試:2024-04-21

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

解題思路
#

「所有小寫都出現在第一個大寫之前」等於「小寫最後一次出現的位置 < 大寫第一次出現的位置」。掃一次記錄兩個位置(Hash Table),兩者都存在而且順序正確的字母就算 special。

我的嘗試
#

2024 年比賽時錯了四次:

  • 第一版用 w not in upper 判斷大寫是否記過,但 w 是大寫、dict 的 key 存的是小寫,永遠判斷成沒記過,第一次出現的位置被後面的大寫覆蓋:"AaA" 答案 0,回傳 1。
  • 改用集合追蹤狀態之後,一版把「小寫之後又出現大寫」也當成錯誤:"aAA" 答案 1,回傳 0。
  • 下一版修好了,但大寫先出現、小寫後出現的情況雖然記了下來卻沒有用來排除:"AaA" 回傳 1。補上這個檢查才 AC。

正確解法
#

class Solution:
    def numberOfSpecialChars(self, word: str) -> int:
        last_lower = {}
        first_upper = {}
        for i, c in enumerate(word):
            if c.islower():
                last_lower[c] = i
            elif c.lower() not in first_upper:
                first_upper[c.lower()] = i
        return sum(1 for c, i in last_lower.items()
                   if c in first_upper and i < first_upper[c])

複雜度
#

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

要特別避免的錯誤
#

  • 大寫要記第一次、小寫要記最後一次。
  • 存成 dict 的 key 時大小寫要一致,否則「已經記過了」的判斷永遠不成立。
  • 大寫在小寫之前(例如 "Aa")也不合格。

面試口說整理
#

我掃一次,記錄每個字母小寫最後出現的位置和大寫第一次出現的位置,兩個都存在而且小寫在前面的字母才算。時間 O(n)。

相關文章

LeetCode 187: Repeated DNA Sequences
·1 分鐘
LeetCode Medium Hash-Table String Bit-Manipulation Sliding-Window
LeetCode 187 解題筆記:把每個長度 10 的子字串丟進雜湊表計數,出現超過一次的就是答案
LeetCode 208: Implement Trie (Prefix Tree)
·1 分鐘
LeetCode Medium Hash-Table String Design Trie
LeetCode 208 解題筆記:每個節點是 children 字典加一個 is_end 標記;insert、search、startsWith 都是沿著字元往下走
LeetCode 424: Longest Repeating Character Replacement
·1 分鐘
LeetCode Medium Hash-Table String Sliding-Window
LeetCode 424 解題筆記:可變長度滑動視窗,視窗長度減掉最多的字元次數就是要替換的數量,超過 k 就縮左邊
LeetCode 981: Time Based Key-Value Store
·2 分鐘
LeetCode Medium Hash-Table String Binary-Search Design
LeetCode 981 解題筆記:每個 key 存一個 (timestamp, value) 的 list,timestamp 是遞增的;get 時二分找最後一個 timestamp <= 查詢時間的
LeetCode 49: Group Anagrams
·1 分鐘
LeetCode Medium Array Hash-Table String Sorting
LeetCode 49 解題筆記:把每個字串排序後當成 key,同一個 key 的字串就是同一組 anagram
LeetCode 17: Letter Combinations of a Phone Number
·1 分鐘
LeetCode Medium Hash-Table String Backtracking
LeetCode 17 解題筆記:每一層處理一個數字,枚舉它對應的字母;空字串要回傳空 list