[LeetCode] 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".

如果仅仅从不断replace输入路径的角度出发,会非常复杂。

如果用一个栈来一次存储各级路径的directory名字,然后重组,会简便一些,这也是文件路径简化类题目的常用思路。

为了末尾可以顺序遍历栈重组path,我们不用传统的stack lib,而用vector来实现栈,这样可以方便顺序遍历。

代码:

class Solution {
public:
    string simplifyPath(string path) {
        if(path.length() == 0) return "";
        vector<string> v;
        int p = 0, start = 0;
        while(p < path.length()){
            if(path[p] == '/') ++p;
            else{
                start = p;
                while(p < path.length() && path[p] != '/') ++p;
                string temp = path.substr(start, p-start);
                if(temp == ".."){ 
                    if(!v.empty()) v.pop_back(); //遇到".."就出栈
                    else{
                        if(path[0] != '/') v.push_back(temp); //如果没东西可以出,就要看path是否以根目录开头了,不是以根目录开头的话,".."要进栈的
                    }
                }else if(temp == "."){} //遇到"."就跳过
                else if(temp.length() > 0){
                    v.push_back(temp);
                }
            }
        }
        string res = (path[0] == '/' ? "/" : ""); //重组path
        for(vector<string>::iterator i = v.begin(); i < v.end(); ++i){
            res.append(*i);
            if(i < v.end()-1) res.append("/");
        }
        return res;
    }
};

 

posted on 2014-04-23 04:23  Felix Fang  阅读(419)  评论(0编辑  收藏  举报

导航