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"
.
題目不難,主要考慮一些特殊情況。
對於path = "/a/./b/../../c/"
, => "/c",模擬一下
先按照'/'對字串進行分割,得到 [a, . , b, .. , .. , c]
首先進入目錄a,注意 '.' 代表當前目錄 ,".."代表上一個目錄
然後到達'.',還是在當前目錄,/a
然後到達'b',這為/a/b
然後到達'..',這是回到父目錄,則變為/a
然後到達'..',繼續回到父目錄,則變為/
然後到達'c',則達到子目錄,變為/c
class Solution { public: vector<string> split(string& path, char ch){ int index = 0; vector<string> res; while(index < path.length()){ while(index < path.length() && path[index] == '/') index++; if(index >= path.length()) break; int start=index, len = 0; while(index < path.length() && path[index]!='/') {index++;len++;} res.push_back(path.substr(start,len)); } return res; } string simplifyPath(string path) { vector<string> a = split(path,'/'); vector<string> file; for(int i = 0 ; i < a.size(); ++ i){ if(a[i] == ".." ){ if(!file.empty()) file.pop_back(); } else if(a[i]!=".") file.push_back(a[i]); } string res=""; if(file.empty()) res ="/"; else{ for(int i = 0 ; i < file.size(); ++ i) res+="/"+file[i]; } return res; } };