71. 简化路径

中等 含交互动画

学完这道你应该能: 说清它为什么用「栈」,而不是死记步骤; 合上页面,自己默写出核心代码; 用 30 秒把思路讲清楚。

题目描述

化简 Unix 绝对路径:. 表示当前目录、.. 表示上一级、多个斜杠合并。

path = "/a/./b/../c"
输出 = "/a/c"

思路解析

先把路径按 / 切成几段。遇到普通目录名就入栈;遇到 .. 就弹出栈顶(回上级);遇到 . 或空串就忽略。最后把栈里的目录用 / 连起来。

读 "a" · 入栈:第一段是普通目录 a,入栈。栈:[a]。

读 "." · 忽略:读到 .,表示「当前目录」,啥也不做,栈不变。

读 "b" · 入栈:普通目录 b,入栈。栈:[a, b]。

读 ".." · 弹栈:读到 ..,回到上一级:弹出栈顶 b。栈变回 [a]。

读 "c" · 入栈:普通目录 c,入栈。栈:[a, c]。

拼接结果:所有段处理完,把栈里 [a, c] 用 / 连起来、前面加根 /,得 "/a/c"

凡是「进入一层 / 退回一层」的结构(目录、括号、撤销操作),栈都是最自然的工具:入栈深入,弹栈回退。

参考代码(Python)

Python
1stack = []
2for part in path.split(class="cl-str">"/"):          # 按 / 切开
3    if part == class="cl-str">"" or part == class="cl-str">".":     # 空段 / 当前目录
4        continue
5    elif part == class="cl-str">"..":                # 回上级
6        if stack: stack.pop()
7    else: stack.append(part)          # 普通目录入栈
8return class="cl-str">"/" + class="cl-str">"/".join(stack)

复杂度分析

  • 时间复杂度:O(n) —— 每段处理一次
  • 空间复杂度:O(n) —— 栈存目录

套路模板

记住骨架:切分 → 忽略项跳过 / 回退项弹栈 / 其余入栈 → 拼接。括号匹配、撤销重做都是同一类栈应用。

Python
1stack = []
2for token in 切分(input):
3    if 忽略(token): continue          # 如 class="cl-str">"" / class="cl-str">"."
4    elif 回退(token): stack and stack.pop()  # 如 class="cl-str">".."
5    else: stack.append(token)         # 深入一层
6return 拼接(stack)

易错点

  • .. 时栈空还 pop → ✅ pop 前先判 stack 非空(根目录的上一级还是根,不能再退)
  • 忘了处理连续 // 产生的空段 → ✅ 空串 "" 也要 continue(split 会产生空字符串)

以上文字与上方动画完全同一思路:先看动画建立直觉 → 读文字巩固 → 关掉页面自己默写一遍代码,能写出来才算真的掌握

下一题 →120. 三角形最小路径和 ← 返回题库