LeetCode 71.简化路径 题解
题目描述
给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 ‘/‘ 开头),请你将其转化为更加简洁的规范路径。
在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,’//‘)都被视为单个斜杠 ‘/‘ 。 对于此问题,任何其他格式的点(例如,’…’)均被视为文件/目录名称。
请注意,返回的 规范路径 必须遵循下述格式:
始终以斜杠 ‘/‘ 开头。
两个目录名之间必须只有一个斜杠 ‘/‘ 。
最后一个目录名(如果存在)不能 以 ‘/‘ 结尾。
此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 ‘.’ 或 ‘..’)。
返回简化后得到的 规范路径 。
样例
1 | 示例 1: |
1 | 示例 2: |
1 | 示例 3: |
1 | 示例 4: |
算法1
(模拟) $O(n)$
本题本质上是模拟进入 Unix 系统路径的方法,只需要按照规定将所有步骤执行,遍历一遍字符串即可
需要注意的是一些边界情况:
- 在根目录时输入了
/../
, 这种情况下需要返回根目录/
,因为根目录无法再向上回到更上级的目录 - 有些路径包含连续的
////
, 应该去掉重复的/
思路: 可以看出,所有的有效路径都是在两个/
中产生的,所以我们应该将 /
视为分界点,统计在两个 /
之间出现的字符串,按照规定模拟即可
规则:
- 当两个
/
之间的字符串为.
或 为空时,说明要么表示在当前目录不动,要么表示有多个/
,这种情况不必更新最终路径 - 当两个
/
之间的字符串为..
时,说明不仅不应该加入新的路径,反而应当将最终路径向前回退至上一个/
- 当
/
之间的字符串为正常路径时,应当更新最终路径,需要注意的时每次更新最终路径时按照/路径名
的方式更新
C++ 代码
1 | class Solution { |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.