题目
给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径。
在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠 '/' 。 对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。
请注意,返回的 规范路径 必须遵循下述格式:
- 始终以斜杠
'/'开头。 - 两个目录名之间必须只有一个斜杠
'/'。 - 最后一个目录名(如果存在)不能 以
'/'结尾。 - 此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含
'.'或'..')。
返回简化后得到的 规范路径 。
示例 1:
输入: path = "/home/"
输出: "/home"
解释:
应删除尾部斜杠。
示例 2:
输入: path = "/home//foo/"
输出: "/home/foo"
解释:
多个连续的斜杠被单个斜杠替换。
示例 3:
输入: path = "/home/user/Documents/../Pictures"
输出: "/home/user/Pictures"
解释:
两个点 ".." 表示上一级目录。
示例 4:
输入: path = "/../"
输出: "/"
解释:
不可能从根目录上升级一级。
示例 5:
输入: path = "/.../a/../b/c/../d/./"
输出: "/.../b/d"
解释:
"..." 是此问题中目录的有效名称。
思路
解法: 分割+入栈判断
首先将字符串根据/分割,对分割后的字符串入栈时,进行判断:
- 如果是"",不入栈
- 如果是".",不入栈
- 如果是"..",栈不为空,则移除栈顶;栈为空,不操作
代码一: split+入栈判断
class Solution:
def simplifyPath(self, path: str) -> str:
res = []
paths = path.split("/")
for name in paths:
if name == "..":
if res:
res.pop()
elif name and name != ".":
res.append(name)
return "/"+"/".join(res)
代码二:自实现split+入栈判断
class Solution:
def simplifyPath(self, path: str) -> str:
res = []
i = 0
n = len(path)
while i < n:
# 每次从/后面的开始取值
s = ""
while i < n and path[i] != "/":
s += path[i]
i += 1
if s == "..":
if res:
res.pop()
elif s and s != ".":
res.append(s)
# 从/后开始隔开
i += 1
return "/"+"/".join(res)
代码三:自实现split另一种写法+入栈判断
class Solution:
def simplifyPath(self, path: str) -> str:
res = []
n = len(path)
i = 0
while i < n:
if path[i] == "/":
i += 1
continue
j = i + 1
while j < n and path[j] != "/":
j += 1
item = path[i:j]
if item == "..":
if len(res) > 0:
res.pop()
elif item != ".":
res.append(item)
i = j
return "/" + "/".join(res) if path != "" else ""