[LeetCode] Simplify Path(可以不用看)

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

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

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".

注意以下几点:input"/.", output"/"

                    input"/..", output"/"

                    input"/...", output"/..."即“...”、“....”等是有效的文件名

class Solution {
public:
    string simplifyPath(string path) { 
        if(path == "/" || path=="")
            return path;
        string result(1,path[0]);
        int len = path.size();
        if(path[len-1]!='/'){
            path.push_back('/');
            len++;
        }

        int j=0,start;
        stack<int> sstart;
        for(int i = 1;i<len;){
            if(path[i] != '/' && path[i] != '.'){//if(1)
                
                while(i<len && path[i]!='/'){
                    result.push_back(path[i++]);
                    j++;
                }
                int flag = j;
                while(flag>=0 && result[flag]!='/'){
                    flag--;
                }
                sstart.push(flag+1);
                if(i<len-1 && path[i]=='/'){
                    result.push_back(path[i++]);
                    j++;
                }else if(i == len-1 && path[i]=='/'){
                    return result; 
                }    
            }else{
                if(path[i]=='/' && result[j]=='/')
                    i++;
                else if(i<len-1 && path[i]=='.' && path[i+1]=='/'){
                    i=i+2;
                }else if(i<len-2 && path[i]=='.' && path[i+1]=='.'&& path[i+2]=='/'){
                    i = i+3;
                    if(result.size() == 1)
                        continue;
                    else{
                        if(result[j]=='/'){
                            start = sstart.top();
                            sstart.pop();
                            result.erase(result.begin()+start,result.end());
                            j = start-1;
                        }else{      //  "/.../""output"/.../"
                            int flag = j;
                            while(flag>=0 && result[flag]!='/'){
                                flag--;
                            }
                            sstart.push(flag+1);
                            result.push_back(path[i-3]);
                            result.push_back(path[i-2]);
                            if(i-1<len-1 && path[i-1]=='/'){
                                result.push_back(path[i-1]);
                                j+=3;
                            }else if(i-1 == len-1 && path[i-1]=='/'){
                                return result; 
                            }    
                        }  
                    }
                }else{
                    result.push_back(path[i++]);
                    j++;
                }            
            }//end if(1)
        }//end for
       while(result[j]=='/' && result.size()!=1){
             result = result.substr(0,j);
             j--;
         }
        return result;          
    }//end func
};

 

posted @ 2014-08-18 16:54  Xylophone  Views(135)  Comments(0Edit  收藏  举报