(描述需要改进) Leetcode No.71 **

以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。

示例 1:

输入:"/home/"
输出:"/home"
解释:注意,最后一个目录名后面没有斜杠。

示例 2:

输入:"/../"
输出:"/"
解释:从根目录向上一级是不可行的,因为根是你可以到达的最高级。

示例 3:

输入:"/home//foo/"
输出:"/home/foo"
解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。

示例 4:

输入:"/a/./b/../../c/"
输出:"/c"

示例 5:

输入:"/a/../../b/../c//.//"
输出:"/c"

示例 6:

输入:"/a//b////c/d//././/.."
输出:"/a/b/c"

解答:逻辑如下:
【1】所有相连的斜杠均可以取消,不保留,用start来记录状态;
【2】循环找相连的 '.',最后的位置为path[i-1],截取该字符串。
【3】判断是否为".."
     判断p是否为空,是则contunue,否则弹出;
  若不是'.'且s不为空,则p压入s;
  若p为空,则直接返回'/';
  否则依次添加路径
  
            


//71
string simplifyPath(string path)
{
    vector<string> p;
    string res;
    int i=0,start;

    while(i<path.size())
    {
        while(i<path.size() && path[i]=='/') i++;//斜杠全部可以取消,不保留
        start = i;
        while(i<path.size() && path[i]!='/') i++;
        string s = path.substr(start,i-start);
        start = i;
        if(s == ".." )
        {
            if(!p.empty())  p.pop_back();
            continue;
        }

        else if(s!="." && s!="") p.push_back(s);
    }
    if(p.empty()) return "/";
    for(string s: p)
        res = res+ "/" +s;
    return res;
}//71

 



posted @ 2019-05-08 22:11  andyalgorithm  阅读(141)  评论(0编辑  收藏  举报