天天看點

NC299 簡化目錄路徑(盡力了)

描述

給定一個目錄路徑的字元串path,path由英文字母,數字,".","/" 或 “_“組成,表示指向某一個檔案或者目錄的絕對路徑,但是有的路徑會有複雜的表達,比如”/…/“其實還是代表的根目錄路徑”/”,請你将這個絕對路徑轉化為一個更加簡潔的規範路徑,轉化規則如下:

1.将1個點".“表示目前目錄本身,即”/a/b/./"=>表示的還是"/a/b"

2.将2個點"…“表示将目前切換到上一級,即”/a/b/…/“其實表示的是”/a"

3.其他數目的點或者點加上其他字元視為一個普通目錄路徑,比如"/…/a…“表示的是根目下有一個名字為”…“的目錄檔案,”…"的檔案下面還有一個名字為"a…"的檔案

4.任意多個連續的斜杠都被視為單個斜杠,即 “///“和”//“都被視為”/”

你傳回的簡化規範路徑應該如下:

5.始終以斜杠 ‘/’ 開頭

6.兩個目錄名之間必須隻有一個斜杠 ‘/’

7.最後一個目錄名不能 以 ‘/’ 結尾,根目錄除外,根目錄隻有一個"/"

8.路徑僅包含從根目錄到目标檔案或目錄的路徑上的目錄,即除了".“和”…"的東西應該簡化,其餘的普通字元應該保留下來,視為目錄路徑

NC299 簡化目錄路徑(盡力了)

示例1

輸入:
"/home/web/"
傳回值:
"/home/web"      

示例2

輸入:
"/homeweb//"
傳回值:
"/home/web"
說明:
在簡化規範路徑中,多個連續的"/"替換為"/",      

示例3

輸入:
"/../"
傳回值:
"/"
說明:
"/"是根目錄,是頂級目錄,它的上級目錄還是自己      

示例4

輸入:
"/home/web/./tang/../miao/"
傳回值:
"/home/web/miao"
說明:
"/home/web/./"表示的是"/home/web",因為"."表示目前目錄,但是"/home/web/./tang/../"表示的還是"/home/web",因為".."表示父目錄,"/home/web/tang"的父目錄就是"/home/web"      
class Solution {
public:
   string simplifyPath(string path) {
    // write code here
    string res;
    vector<int>posvec;
    for(int i=0;i<path.size();i++)
    {
        res.push_back(path[i]);
        if(res.size()>1)
        {
            if(res.find("//")!=string::npos)
            {
                res.pop_back();
                continue;
            }
            
            if(path[i]=='.')
            {
                posvec.push_back(i);
                if(posvec.size()>2)
                {
                    posvec.clear();
                    continue;
                }
                if(posvec.size()==2)
                {
                    if(posvec[0]>0)
                    {
                        if((( path[posvec[0]-1])>='a')&&((path[posvec[0]-1]<='z')))
                        {
                            posvec.clear();
                        }
                    }
                }
            }
            else if(path[i]=='/')
            {
                if(posvec.size()==1)
                {
                    if((( path[posvec[0]-1])>='a')&&((path[posvec[0]-1]<='z')))
                        {
                            posvec.clear();
                            continue;
                        }
                    posvec.clear();
                    res.pop_back();
                    res.pop_back();
                }
                else if(posvec.size()==2)
                {
                    posvec.clear();
                    res.pop_back();
                    res.pop_back();
                    res.pop_back();
                    if(res.length()<=1)
                        continue;
                    res.pop_back();
                    while(1)
                    {
                        
                        if(res.back()=='/'){
                            break;
                        }
                        else
                            res.pop_back();
                        
                    }
                    
                }
                
                posvec.clear();
            }
            else
            {
                posvec.clear();
            }
            
        }
    }
    if(posvec.size()==2)
    {
        for(int i=0;i<posvec.size();i++)
            res.pop_back();
        res.pop_back();
        if(res.length()==0)
            res.push_back('/');
        while(1)
        {
            if(res.back()=='/'){
                break;
            }
            else
                res.pop_back();
        }
        
    }
    if(posvec.size()==1)
        res.pop_back();
    
    cout<<res<<endl;
    if(res.back()=='/'&&res.length()>1)
        res.pop_back();
    return res;
}

   
};