LeetCode71. 簡化路徑 (simplifyPath)
阿新 • • 發佈:2018-11-09
題目描述
給定一個文件 (Unix-style) 的完全路徑,請進行路徑簡化。
示例:
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"
邊界情況:
你是否考慮了 路徑 = "/../" 的情況?
在這種情況下,你需返回 "/" 。
此外,路徑中也可能包含多個斜槓 '/' ,如 "/home//foo/" 。
在這種情況下,你可忽略多餘的斜槓,返回 "/home/foo" 。
解題思路
這道題讓簡化給定的路徑,光是根據題目中給的那一個例子還真不太好總結出規律,應該再加上兩個例子 path = “/a/./b/…/c/”, => “/a/c"和path = “/a/./b/c/”, => “/a/b/c”, 這樣我們就可以知道中間是”.“的情況直接去掉,是”…“時刪掉它上面挨著的一個路徑,而下面的邊界條件給的一些情況中可以得知,如果是空的話返回”/",如果有多個"/“只保留一個。那麼我們可以把路徑看做是由一個或多個”/"分割開的眾多子字串,把它們分別提取出來一一處理即可。
程式碼
class Solution {
public:
string simplifyPath(string path) {
vector <string> v;
int i=0;//遍歷指標
while(i<path.size()){
while(path[i]=='/'&&i<path.size()) i++;
if(i==path.size()) break;
int start=i;
while (path[i]!='/'&&i<path.size()) i++;
int end=i-1;
string s=path.substr(start,end-start+1);
if (s=="..") {
if (!v.empty()) v.pop_back();
} else if (s!=".") {
v.push_back(s);
}
}
if(v.empty ()) return "/";
string res;
for(int i=0;i<v.size();i++){
res+="/"+v[i];
}
return res;
}
};
注:
substr有2種用法:
假設: string s = “0123456789”;
string sub1 = s.substr(5); //只有一個數字5表示從下標為5開始一直到結尾:sub1 = “56789”
string sub2 = s.substr(5, 3); //從下標為5開始擷取長度為3位:sub2 = “567”