一起刷力扣之【71. 简化路径】

750 阅读2分钟

这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战

题目

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

在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠 '/' 。 对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。

请注意,返回的 规范路径 必须遵循下述格式:

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

示例

输入: path = "/home/"
输出: "/home"
解释: 注意,最后一个目录名后面没有斜杠。 
输入: path = "/../"
输出: "/"
解释: 从根目录向上一级是不可行的,因为根目录是你可以到达的最高级。
输入: path = "/home//foo/"
输出: "/home/foo"
解释: 在规范路径中,多个连续斜杠需要用一个斜杠替换。
输入: path = "/a/./b/../../c/"
输出: "/c"

提示

  • 1 <= path.length <= 3000
  • path 由英文字母,数字,'.''/''_' 组成。
  • path 是一个有效的 Unix 风格绝对路径。

解题思路

由题目我们可以得出字符串path中,有几个字符有对应的动作:

  • .表示当前目录本身
  • ..表示需要切换至上一级目录
  • //需要视为/

由于路径是通过/符号来表示目录,因此我们可以现将字符集进行分割,将多级目录分隔开。再用栈来实现入队出队的操作,正常字符则入队,遇到空字符串或者.则不进行任何操作,遇到..则将前一目录弹出。

代码实现

class Solution {
    public String simplifyPath(String path) {
        // 分隔多级目录
        String[] paths = path.split("/");
        LinkedList<String> list = new LinkedList<>();
        // 遍历所有的目录
        for(String p : paths){
            // 不做任何操作
            if(".".equals(p) || "".equals(p)){
                continue;
            }
            // 当遇到 .. 则弹出上一级目录
            if(!list.isEmpty() && "..".equals(p)){
                list.removeLast();
            }else if(!"..".equals(p)){
                // 正常目录,入栈
                list.add(p);
            }
        }
        
        // 拼接字符串,得到最终的目录
        StringBuilder sb = new StringBuilder("/");
        for(int i = 0; i < list.size(); ++i){
            sb.append(list.get(i));
            if(i < list.size() - 1){
                sb.append("/");
            }
        }

        return sb.toString();
    }
}