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

LeetCode 821: Shortest Distance to a Character

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

基本資料
#

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

  • 提交紀錄:Wrong Answer → Accepted

解題思路
#

每個位置的答案是「左邊最近的 c」和「右邊最近的 c」兩個距離取小。從左往右掃一次,記住上一次看到 c 的位置;再從右往左掃一次,做一樣的事並取最小值。還沒看到 c 時把位置設成無限遠。

我的嘗試
#

第一版的第二輪(從右往左)取最小值時忘了 +1,而且漏了 return,回傳 None;補上兩個就 AC 了。

正確解法
#

class Solution:
    def shortestToChar(self, s: str, c: str) -> List[int]:
        n = len(s)
        res = [0] * n
        last = float("-inf")
        for i in range(n):
            if s[i] == c:
                last = i
            res[i] = i - last
        last = float("inf")
        for i in range(n - 1, -1, -1):
            if s[i] == c:
                last = i
            res[i] = min(res[i], last - i)
        return res

複雜度
#

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

要特別避免的錯誤
#

  • 兩個方向都要掃,只掃一邊會漏掉另一邊比較近的 c。
  • 從右邊傳回來的距離要 +1。

面試口說整理
#

我從左往右掃一次算到左邊最近的 c 的距離,再從右往左掃一次算到右邊最近的,兩者取小。時間 O(n)。

相關文章

LeetCode 832: Flipping an Image
·1 分鐘
LeetCode Easy Array Two-Pointers Bit-Manipulation Matrix
LeetCode 832 解題筆記:每一列先左右反轉再把 0、1 互換;可以用左右指針同時做
LeetCode 844: Backspace String Compare
·1 分鐘
LeetCode Easy Two-Pointers String Stack Simulation
LeetCode 844 解題筆記:用 stack 模擬退格;O(1) 空間的話從尾巴往前,遇到 # 就記下要跳過幾個字元
LeetCode 819: Most Common Word
·1 分鐘
LeetCode Easy Array Hash-Table String Counting
LeetCode 819 解題筆記:標點換成空白、全部轉小寫再切單字,計數後找出不在 banned 裡的最多的那個
LeetCode 806: Number of Lines To Write String
·1 分鐘
LeetCode Easy Array String
LeetCode 806 解題筆記:模擬寫字,加上去會超過 100 就換行;剛好 100 時還留在這一行
LeetCode 748: Shortest Completing Word
·1 分鐘
LeetCode Easy Array Hash-Table String
LeetCode 748 解題筆記:車牌只看字母並轉小寫計數,找出每個字母次數都夠的最短單字,同長度取最前面的
LeetCode 680: Valid Palindrome II
·1 分鐘
LeetCode Easy Two-Pointers String Greedy
LeetCode 680 解題筆記:左右指針遇到第一對不同時,只有兩種刪法:刪左邊或刪右邊,檢查剩下的是否為回文