描述
給定一個目錄路徑的字元串path,path由英文字母,數字,".","/" 或 “_“組成,表示指向某一個檔案或者目錄的絕對路徑,但是有的路徑會有複雜的表達,比如”/…/“其實還是代表的根目錄路徑”/”,請你将這個絕對路徑轉化為一個更加簡潔的規範路徑,轉化規則如下:
1.将1個點".“表示目前目錄本身,即”/a/b/./"=>表示的還是"/a/b"
2.将2個點"…“表示将目前切換到上一級,即”/a/b/…/“其實表示的是”/a"
3.其他數目的點或者點加上其他字元視為一個普通目錄路徑,比如"/…/a…“表示的是根目下有一個名字為”…“的目錄檔案,”…"的檔案下面還有一個名字為"a…"的檔案
4.任意多個連續的斜杠都被視為單個斜杠,即 “///“和”//“都被視為”/”
你傳回的簡化規範路徑應該如下:
5.始終以斜杠 ‘/’ 開頭
6.兩個目錄名之間必須隻有一個斜杠 ‘/’
7.最後一個目錄名不能 以 ‘/’ 結尾,根目錄除外,根目錄隻有一個"/"
8.路徑僅包含從根目錄到目标檔案或目錄的路徑上的目錄,即除了".“和”…"的東西應該簡化,其餘的普通字元應該保留下來,視為目錄路徑
示例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;
}
};