zoukankan      html  css  js  c++  java
  • [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
    };
  • 相关阅读:
    hlgoj 1766 Cubing
    Reverse Linked List
    String to Integer
    Bitwise AND of Numbers Range
    Best Time to Buy and Sell Stock III
    First Missing Positive
    Permutation Sequence
    Next Permutation
    Gray Code
    Number of Islands
  • 原文地址:https://www.cnblogs.com/Xylophone/p/3919930.html
Copyright © 2011-2022 走看看