码迷,mamicode.com
首页 > 其他好文 > 详细

71. Simplify Path

时间:2016-05-16 11:02:27      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:

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

For example,
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"

简化一个Unix风格的绝对路径。

从上面的例子可以看出需要支持‘.‘和‘..‘,另外还要考虑一些特殊情况如"/../"这样的要返回"/",如果多个‘/‘连在一起如"/home//foo/",返回"/home/foo"。

首先需要以‘/‘,对路径分隔出不同的token,然后使用一个stack来模拟路径,对每一个新token压入堆栈,如果是token是空或者‘.‘则不作处理,如果token是‘..‘并且堆栈不为空则弹出栈首,算法复杂度是O(N),N为输入路径的长度。给出代码如下,为了方便转换输出,下面用vector代替stack。

string simplifyPath(string path) {
    vector<string> prev;
    string str;
    int i = 0;
    while (!(str=next(path,i)).empty())
    {
        if ("." == str) continue;
        if (".." == str)
        {
            if (!prev.empty())
                prev.pop_back();
        }
        else
            prev.push_back(str);
    }
    
    string ret;
    for (int i=0; i<prev.size(); ++i)
        ret += "/" + prev[i];
    return ret.empty()?"/":ret;
}
string next(string path, int& i)
{
    if (i == path.size())
        return "";
        
    size_t pos = path.find(/, i+1);
    if (pos != string::npos)
    {
        if (i+1 == pos)
            return next(path, ++i);
        string ret = path.substr(i+1, pos-i-1);
        i = pos;
        return ret;
    }
    else
    {
        string ret = path.substr(i+1);
        i = path.size();
        return ret;
    }
}

 

71. Simplify Path

标签:

原文地址:http://www.cnblogs.com/zhiguoxu/p/5497059.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!