欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LeetCode 71 Simplify Path题解

程序员文章站 2022-03-05 11:38:05
...

首先上题目内容
LeetCode 71 Simplify Path题解
该题想让我们对于输入的文件名信息进行转换。对于Linux目录文件的特点这里笔者再做几点强调:

  1. 一个点代表当前目录;
  2. 两个点代表上一级目录;
  3. 最简格式每一级目录间只能有一个/;
  4. 文件末尾不能带有/;

然后关键的问题是怎样进行转换呢?请看如下测试案例
LeetCode 71 Simplify Path题解
细心一点会发现,比如/a/…/…/b/…/c//.//,每逢…退回上一级目录,每逢.保持当前目录。这里可以用栈来模拟这个过程。即:

  1. ‘…’表示退栈;
  2. 两个/之间是文件名的情况则入栈。
  3. 最后所有元素出栈
    注意栈中元素的顺序是与实际文件名的顺序相反,最后处理时需要考虑到这个点
    接下来上代码:
string simplifyPath(string path) {
        stack<string> finall;
        vector<string> tempf;
        string finalls="";
        for(int i=0;i<path.size();i++)
        {
            //如果字符是‘/’,则不需要处理。
            if(path[i]=='/')
                continue;
            //否则就是其他字符,即文件夹的名字
            else
            {
                int j=i;
                //通过遍历找到下一个‘/’,表示该文件夹名的终止位置。
                for(;j<path.size();j++)
                {
                    if(path[j]=='/')
                        break;
                }
                string temp=path.substr(i,j-i);
                //处理具有特殊含义的字串如.,..
                //如果字串是..,则表示返回上一级目录,出栈操作。
                if(temp=="..")
                {
                    if(!finall.empty())
                        finall.pop();
                }
                //如果字串是.,表示当前目录,不做任何处理。
                else if(temp==".")
                {
                    continue;
                }
                //否则就是正常的文件名,入栈操作
                else
                {
                    finall.push(temp);
                }
                i=j;
            }
        }
        if(finall.empty())
            return "/";
        //由于出栈后文件名的顺序是由内到外,需要利用一个vector来暂存信息,最后反向输出vector的信息
        while(!finall.empty())
        {
            tempf.push_back(finall.top());
            finall.pop();
        }
        for(int i=tempf.size()-1;i>=0;i--)
        {
            finalls+="/"+tempf[i];
        }
        return finalls;
    }

然后例常来张结果图纪念:
LeetCode 71 Simplify Path题解

相关标签: 算法 数据结构