Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/"
, => "/home"
path = "/a/./b/../../c/"
, => "/c"
// class Solution {
// public:
// string simplifyPath(string path) {
// int len = path.length();
// if(len == 0) return "";
// string ans = "/", str="";
// int forward=0, backward=0;
// for(int i = 1; i < len; i++) {
// if(path[i]!='/') {
// str += path[i];
// } else if(path[i]=='/') {
// if(str=="..") {
// backward-=1;
// } else
// if(str!="." && str!="") {
// forward+=1;
// ans+=str;
// ans+="/";
// }
// str="";
// }
// }
// if(str.length() > 0) {
// ans+=str;
// forward++;
// ans += "/";
// }
// int cnt = forward+backward;
// string ret="/";
// if(cnt <= 0) return ret;
// else {
// int pos = -1;
// while(backward <= 0) {
// pos = ans.find("/", pos+1);
// backward++;
// }
// if(pos < 0) pos = 0;
// ret = ans.substr(pos);
// ret = ret.substr(0, ret.length()-1);
// return ret;
// }
// }
// }
/*class Solution {
public:
string simplifyPath(string path) {
int len=path.length();
string ret="";
if(len==0) return "/";
stack<string> name;
string temp="";
for(int i=1; i < len; i++) {
if(path[i]!='/'){
temp+=path[i];
} else if(path[i]=='/') {
if(temp=="" || temp==".") {
temp="";
} else if(temp=="..") {
if(name.empty()) return "/";
else {
name.pop();
}
temp="";
}else {
name.push(temp);
}
}
}
if(temp=="" || temp==".") {
temp="";
} else if(temp=="..") {
if(name.empty()) return "/";
else {
name.pop();
}
temp="";
}else {
name.push(temp);
}
if(name.empty()) return "/";
while(!name.empty()) {
ret+=name.top();
name.pop();
ret+="/";
}
reverse(ret.begin(), ret.end());
return ret;
}
}*/
class Solution{
public:
string simplifyPath(string path) {
string res, tmp;
vector<string> stk;
stringstream ss(path);
while(getline(ss, tmp, "/")) {
if(tmp=="" or tmp==".") continue;
if(tmp==".." and !stk.empty()) stk.pop_back();
else if(tmp!="..") stk.push_back(tmp);
}
for(auto str:stk) {
res+="/"+str;
}
return res.empty() ? "/" : res;
}
}