首页 > 代码库 > [LeetCode] Simplify Path(可以不用看)

[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};