Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"
"/../"?In this case, you should return
"/".'/' together, such as "/home//foo/".In this case, you should ignore redundant slashes and return
"/home/foo".We can use a stack to help deal with the '/..' backwards case.
C++ Code:
/*
* func: simplify_path
* goal: simplify input absolute path
* @param path: input path
* return: simplified path
*/
string simplify_path(const string &path){
string result = "";
string dir = "";
deque<string> path_helper;
for(const char &ch : path){
if(ch != '/'){
dir += ch;
}else{
//If current char is '/' and previous char is also '/'
//Skip this one
if(dir == "/"){
continue;
}else if(dir == "/."){
//If previous dir is '/.', nothing changed, continue to read next directory
dir = "/";
}else if(dir == "/.."){
//If previous dir is '/..', pop one from stack if there exists
if(!path_helper.empty()){
path_helper.pop_back();
}
dir = "/";
}else{
//If previous dir is not a special case, push back it to stack, and read the next one
if(dir != "")
path_helper.emplace_back(dir);
dir = "/";
}
}
}
//If the last one is '/..', pop if available
if(dir == "/.."){
if(!path_helper.empty()){
path_helper.pop_back();
}
}else if(dir != "/" && dir != "/."){
//If the last one is a normal one, push back it to the stack
path_helper.emplace_back(dir);
}
//If there is nothing in the stack, return root directory
if(path_helper.empty()){
return "/";
}
auto it = path_helper.begin();
while(it != path_helper.end()){
result += *it++;
}
return result;
}
Python Code:
# func: simplify the input absolute path
# @param path: input path
# @return: simplified path
def simplify_path(path):
dirs = path.split("/")
stack = []
for directory in dirs:
if not directory or directory == '.':
continue
elif directory == '..':
if stack:
stack = stack[:-1]
else:
stack.append(directory)
if not stack:
return '/'
else:
result = ""
for directory in stack:
result += "/" + directory
return result
No comments:
Post a Comment