1. 程式人生 > >leetcode第一刷_Simplify Path

leetcode第一刷_Simplify Path

層次 eas link pid res 遇到 sheet 當前 empty

這道題的思路還是比較清晰的,用棧嘛,麻煩是麻煩在這些層次的細節上。主要有以下幾個:

./和/:當前路徑,遇到這樣的,應該將後面的文件夾或文件入棧。

../:上一層路徑。遇到這樣的。應該做一次出棧操作,相當於返回了上一層文件夾。

//:能夠直接簡化成‘/’。

還有以下幾個要註意的測試用例:

1. linux的路徑名能夠含有非常多特殊字符,比方“_”,".","*"等等,所以要特別註意含有"."的哪些路徑名。

2. 在路徑最後的..和.是不須要後面接上‘/‘的。

代碼寫的不是非常好。回頭應該更正一下:

class Solution {
public:
    string simplifyPath(string path) {
        stack<string> s;
        int len = path.length();
        int i=0;
        string tp, res="";
        while(i<len){
            if(path[i] == ‘/‘){i++;}
            else if(isalnum(path[i])||path[i]==‘_‘){
                int j=i+1;
                while(path[i-1]==‘.‘) i--;
                while((isalnum(path[j])||path[j]==‘_‘)&&j<len) j++;
                tp = path.substr(i, j-i);
                s.push(tp);
                i = j;
            }else if(path[i] == ‘.‘){
                if(i+1==len)    break;
                else if(path[i+1]==‘/‘) i = i+2;
                else if(path[i+1]==‘.‘){
                    if(path[i+2] == ‘/‘||i+2==len){
                        i = i+3;
                        if(!s.empty())	s.pop();
                    }else if(path[i+2] == ‘.‘){
                        if(i+3==len||path[i+3] == ‘/‘)
                            s.push("...");
                        i = i+3;
                    }else
                        i = i+2;
                }else
                    i = i+1;
            }
        }
        if(s.empty())   res = "/";
        else{
            while(!s.empty()){
                res = "/"+s.top()+res;
                s.pop();
            }
        }
        return res;
    }
};


leetcode第一刷_Simplify Path