Description
Given an absolute path for a file (Unix-style), simplify it.
For example,
path = “/home/“, => “/home”
path = “/a/./b/../../c/“, => “/c”
The original problem is here.
The original code is here.
My Solution
I solve this problem in C++, as below:
/*
*Simplify Path
*Author: shuaijiang
*Email: zhaoshuaijiang8@gmail.com
*/
#include<iostream>
#include<stack>
#include<stdlib.h>
using namespace std;
class Solution {
public:
string simplifyPath(string path) {
string result;
int size = path.size();
stack<string> myStack;
string onePart;
int i=0,j=0;
for(;i<size;i++){
int len = i-j-1;
if(path[i] == '/'){
if(len > 0){
onePart = path.substr(j+1,len);
if(onePart == ".")
;
else if(onePart == ".."){
if(!myStack.empty())
myStack.pop();
}
else
myStack.push(onePart);
}
j = i;
}
else if(i == size - 1 && len >= 0){
onePart = path.substr(j+1,len+1);
if(onePart == ".")
;
else if(onePart == ".."){
if(!myStack.empty())
myStack.pop();
}
else
myStack.push(onePart);
}
}
while(!myStack.empty()){
if(result.size() == 0)
result = myStack.top();
else
result = myStack.top() + "/" + result;
myStack.pop();
}
result = "/" + result;
return result;
}
};
Note
To solve the problem, a stack is used to save every part of the path. If reach “.”, ignore it, if reach “..”, pop the stack.