71 简化路径

一、题目

给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为 更加简洁的规范路径

在 Unix 风格的文件系统中规则如下:

  • 一个点 '.' 表示当前目录本身。
  • 此外,两个点 '..' 表示将目录切换到上一级(指向父目录)。
  • 任意多个连续的斜杠(即,'//''///')都被视为单个斜杠 '/'
  • 任何其他格式的点(例如,'...''....')均被视为有效的文件/目录名称。

返回的 简化路径 必须遵循下述格式:

  • 始终以斜杠 '/' 开头。
  • 两个目录名之间必须只有一个斜杠 '/'
  • 最后一个目录名(如果存在)不能'/' 结尾。
  • 此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 '.''..')。

返回简化后得到的 规范路径

二、题解

思路: 栈 + 字符串分割

核心是把路径按 / 拆分,再用一个栈来模拟目录的进入与返回。

  1. 分割:/ 切分原始路径,得到若干段。由于连续斜杠、开头斜杠的存在,分割结果里会夹杂空字符串 ""
  2. 逐段处理:
    • 遇到 ..:表示返回上一级,若栈非空则弹出栈顶目录。
    • 遇到 ""(连续斜杠产生)或 .(当前目录):直接忽略。
    • 其余情况:视为合法目录名,压入栈中。
  3. 拼接结果: 栈中从底到顶就是规范路径上的各级目录,用 / 连接并在最前面补一个根目录 / 即可。
import java.util.LinkedList;

class Solution {
    public String simplifyPath(String path) {
        // 使用 LinkedList 作为栈来存储目录路径
        LinkedList<String> stack = new LinkedList<>();

        // 按照 "/" 分割路径
        String[] directories = path.split("/");

        for (String dir : directories) {
            // 遇到 "..",表示返回上一级,从栈顶弹出一个目录
            if (dir.equals("..")) {
                if (!stack.isEmpty()) {
                    stack.removeLast();
                }
            }
            // 遇到普通目录名,压入栈中
            // 排除掉空字符串 "" (连续斜杠导致) 和 "." (当前目录)
            else if (!dir.isEmpty() && !dir.equals(".")) {
                stack.addLast(dir);
            }
        }

        // 将栈中元素用 "/" 拼接,前面再加上根目录的 "/"
        return "/" + String.join("/", stack);
    }
}

时间复杂度O(N)O(N)

空间复杂度O(N)O(N)

评论