LeetCode ---- 71、简化路径

题目链接

思路:

首先,需要将所给路径字符串根据目录分隔符"/"进行分割,得到包含路径中各个目录的字符串数组。

准备一个栈,用于存储路径中有效的目录。

从头到尾开始遍历得到字符串数组

若当前字符串等于".",则说明原路径中存在的是"/./",这种路径并不起到任何指向路径的作用,需跳过;

若当前字符串等于"",则说明原路径中存在的是"//",这种路径并不起到任何指向路径的作用,需跳过;

若当前字符串等于"..",则说明原路径中存在的是"/../",这种路径说明需要返回到上一级目录,则若栈不为空,需将栈顶目录弹出;

若当前字符串不等于以上三种类型,则说明此时代表一个有效的目录,需要将此字符串压入栈中。

最后,栈中所有的目录都是组成有效路径的目录,但是从栈顶到栈底目录的顺序是逆序

本人是使用Deque作为栈,推荐用到栈时使用Deque,利用Deque的性质,可以从栈底(队尾)来取出数据。

    public String simplifyPath(String path) {
        if (path == null || path.length() == 0) {
            return "";
        }
        // 将路径用分隔符"/"分隔成字符串数组
        String[] strs = path.split("/");
        // 准备一个栈,用于存储路径
        Deque<String> stack = new ArrayDeque<>();
        for (String str : strs) {
            // 若当前字符串为"..",则说明需要返回上一层目录,此时需要将栈顶存储的目录弹出
            if (str.equals("..")) {
                if (!stack.isEmpty()) {
                    stack.pop();
                }
            // 此时什么都不做,因为不符合路径规范
            } else if (str.equals(".") || str.equals("")) {   
                continue;
            // 剩余的就是路径了,压入栈中
            } else {
                stack.push(str);
            }
        }
        // 若栈中为空,则说明路径到了根目录,返回"/"
        if (stack.isEmpty()) {
            return "/";
        }
        StringBuilder sb = new StringBuilder();
        while (!stack.isEmpty()) {
            // 每次从栈底弹出,并在前面加"/"
            sb.append("/" + stack.pollLast());  // 利用Deque的特性
        }
        return sb.toString();
    }

猜你喜欢

转载自blog.csdn.net/sinat_34679453/article/details/106878518
今日推荐