栈-N71-简化路径

题目

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

    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();
    }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,670评论 0 5
  • Java byte code 的学习意义 为啥要学java bytecode,这就跟你问我已经会python了为...
    shanggl阅读 1,840评论 0 3
  • 栈模型## 栈(Stack)是限制插入和删除只能在一个位子上进行的表,该位子是表的末端,叫做栈的顶(top)。对栈...
    kylinxiang阅读 1,745评论 0 1
  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 8,074评论 0 27
  • 造纸术。粗糙的造纸术。
    云皆木阅读 94评论 0 0

友情链接更多精彩内容