zoukankan      html  css  js  c++  java
  • LeetCode(71) Simplify Path

    题目

    Given an absolute path for a file (Unix-style), simplify it.

    For example,
    path = “/home/”, => “/home”
    path = “/a/./b/../../c/”, => “/c”
    click to show corner cases.

    Corner Cases:
    Did you consider the case where path = “/../”?
    In this case, you should return “/”.
    Another corner case is the path might contain multiple slashes ‘/’ together, such as “/home//foo/”.
    In this case, you should ignore redundant slashes and return “/home/foo”.

    分析

    这道题的要求是简化一个Unix风格下的文件的绝对路径。

    字符串处理,由于”..”是返回上级目录(如果是根目录则不处理),因此可以考虑用栈记录路径名,以便于处理。需要注意几个细节:

    1. 重复连续出现的’/’,只按1个处理,即跳过重复连续出现的’/’;

    2. 如果路径名是”.”,则不处理;

    3. 如果路径名是”..”,则需要弹栈,如果栈为空,则不做处理;

    4. 如果路径名为其他字符串,入栈。

    最后,再逐个取出栈中元素(即已保存的路径名),用’/’分隔并连接起来,不过要注意顺序呦。

    时间复杂度:O(n)

    空间复杂度:O(n)

    AC代码

    class Solution {
    public:
        string simplifyPath(string path) {
            if (path.empty())
                return string();
    
            stack<string> st;
            int len = path.length();
    
            for (int i = 0; i < len;)
            {
                //跳过/
                while (i < len && path[i] == '/')
                    i++;
                //找到以/分隔的目录名
                string s = "";
                while ( i < len && path[i] != '/')
                {
                    s += path[i];
                    i++;
                }
    
                //如果为..则需要弹栈
                if (s == ".." && !st.empty())
                    st.pop();
                //如果既不是. 也不是.. 则需要入栈
                else if (s != "" && s != "." && s != "..")
                    st.push(s);
    
            }
            //如果栈空,则为根目录
            if (st.empty())
            {
                return "/";
            }
    
            //否则链接各级目录并返回
            string ret;
            while (!st.empty())
            {
                ret = '/' + st.top() + ret;
                st.pop();
            }
    
            return ret;
        }
    
    };

    GitHub测试程序源码

  • 相关阅读:
    牛客小白月赛21
    牛客小白月赛21
    CodeForces 1333-C Eugene and an array(子区间和为0、前缀和)
    页面大小、页表项、虚拟地址和物理地址之间的关系(转)
    001-Paint_FreePythonGames项目代码详解(每行都有注释!!!)
    第17讲~第19讲:函数:python的乐高积木
    第16讲:序列!序列!
    第15讲:字符串格式化
    练习23--字符串、字节和编码
    第14讲:字符串--各种奇葩内置方法
  • 原文地址:https://www.cnblogs.com/shine-yr/p/5214826.html
Copyright © 2011-2022 走看看