LeetCode 71-简化路径

110 阅读2分钟

题目

给你一个字符串 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 ""