美文网首页
栈-N71-简化路径

栈-N71-简化路径

作者: 三次元蚂蚁 | 来源:发表于2019-04-12 11:50 被阅读0次

    题目

    • 概述:给定一个绝对路径,简化它,简化规则如下:

      1. 消去'.'('.'表示当前目录本身
      2. 消去'..'('..'表示上一级)
      3. 消去重复的'/'
      4. 路径开头必须为'/'
      5. 消去路径结尾的'/'
    • 出处:https://leetcode-cn.com/problems/simplify-path/

    思路

    • 由于需要存储之前的路径,使得以后能够返回,所以考虑用栈实现

    • 用一个字符串变量temp存储'/'之间的字符串,则输入的字符串类型总共有种,分别为'/','.','..',普通字符串

    • 遍历字符串(若字符串末尾不为"/"则在末尾补一个"/":

      1. '/' :

        若栈为空则将"/"入栈

        1. temp为空 => 不处理
        2. temp == '.' => 不处理
        3. temp == 普通字符串 => temp入栈,"/"入栈
        4. temp == '..':栈顶元素出栈
          1. 若此时栈为空,则将"/"入栈
          2. 若此时栈不为空,则将栈顶元素出栈

        清空temp

      2. 其它字符都拼接到temp中

    • 将栈顶元素依次出栈并逆序拼接

    • 若最终字符串末尾为"/"且长度大于1,则将末尾的"/"消去

    代码

    class Solution {
        public String simplifyPath(String path) {
            if (path == null || "".equals(path)) {
                return "/";
            }
            
            LinkedList<String> stack = new LinkedList<>();
            StringBuilder result = new StringBuilder();
            StringBuilder temp = new StringBuilder();
            
            stack.push("/");
            if ('/' != path.charAt(path.length() - 1)) {
                path = path + "/";
            }
            
            for (char c : path.toCharArray()) {
                switch (c) {
                    case '/':
                        switch (temp.toString()) {
                            case "":
                            case ".":
                                break;
                            case "..":
                                stack.pop();
                                if (stack.isEmpty()) {
                                    stack.push("/");
                                } else {
                                    stack.pop();
                                }
                                break;
                            default:
                                stack.push(temp.toString());
                                stack.push("/");
                                break;
                        }
                        temp = new StringBuilder();
                        break;
                    default:
                        temp.append(c);
                        break;
                }
            }
            
            while (!stack.isEmpty()) {
                result.insert(0, stack.pop());
            }
            
            if (result.length() > 1 && '/' == result.charAt(result.length() - 1)) {
                result.deleteCharAt(result.length() - 1);
            }
            
            return result.toString();
        }
    }
    

    相关文章

      网友评论

          本文标题:栈-N71-简化路径

          本文链接:https://www.haomeiwen.com/subject/kdzqwqtx.html