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

LeetCode 71: Simplify Path

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

基本資料
#

難易度: medium 第一次嘗試:2022-10-24

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

解題思路
#

用 / 切開後每一段(Stack 模板一):

  • 空字串(連續的 /)和 .:跳過。
  • ..:stack 不是空的就 pop,在根目錄就不動。
  • 其他(包括 ...):當成目錄名稱 push。

答案是 "/" + "/".join(stack),stack 是空的時剛好是 "/"。

我的嘗試
#

這題提交了 14 次:

  • 第一版想逐字元從後往前處理,判斷 . 和 / 的條件很亂,/ 本身就回傳空字串。
  • 改成 split('/') 加 stack 之後,一個一個補邊界:根目錄的 .. 對空的 stack pop(IndexError)、空字串沒跳過(/ 回傳 //)、. 沒跳過(/. 回傳 /.)。
  • 2022-11 重寫兩次,又各漏了一次 . 和根目錄的 ..(/.. 回傳 /..)。

正確解法
#

class Solution:
    def simplifyPath(self, path: str) -> str:
        st = []
        for part in path.split("/"):
            if part == "..":
                if st:
                    st.pop()
            elif part and part != ".":
                st.append(part)
        return "/" + "/".join(st)

複雜度
#

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

要特別避免的錯誤
#

  • split("/") 會產生空字串,要跳過。
  • . 要跳過,... 是合法的名稱。
  • 根目錄的 .. 不能 pop 空的 stack,也不能把 .. 放進去。

面試口說整理
#

我用斜線把路徑切開,空字串和點跳過,兩個點就把上一層 pop 掉,在根目錄就不動,其他名稱 push 進 stack,最後用斜線接起來。時間 O(n)。

相關文章

LeetCode 49: Group Anagrams
·1 分鐘
LeetCode Medium Array Hash-Table String Sorting
LeetCode 49 解題筆記:把每個字串排序後當成 key,同一個 key 的字串就是同一組 anagram
LeetCode 43: Multiply Strings
·1 分鐘
LeetCode Medium Math String Simulation
LeetCode 43 解題筆記:num1[i] × num2[j] 的結果落在第 i + j + 1 位,用一個長度 n + m 的陣列累加後再統一進位
LeetCode 17: Letter Combinations of a Phone Number
·1 分鐘
LeetCode Medium Hash-Table String Backtracking
LeetCode 17 解題筆記:每一層處理一個數字,枚舉它對應的字母;空字串要回傳空 list
LeetCode 5: Longest Palindromic Substring
·1 分鐘
LeetCode Medium Two-Pointers String Dynamic-Programming Manacher
LeetCode 5 解題筆記:中心擴展,每個位置當奇數和偶數長度的中心往外擴;區間 DP 的話 i 要從大到小
LeetCode 1047: Remove All Adjacent Duplicates In String
·1 分鐘
LeetCode Easy String Stack
LeetCode 1047 解題筆記:stack 頂端跟目前字元相同就一起消掉,否則放進 stack;消掉之後新的頂端可能又能跟下一個消
LeetCode 1021: Remove Outermost Parentheses
·1 分鐘
LeetCode Easy String Stack Bracket-Sequences
LeetCode 1021 解題筆記:用深度計數取代 stack,深度從 0 變 1 的左括號和從 1 變 0 的右括號是外層,其他都保留