Given an absolute path for a file (Unix-style), simplify it.
For example,
path = “/home/”, => “/home”
path = “/a/./b/../../c/”, => “/c”
O(n)
#include <iostream>
#include <vector>
#include<cmath>
#include <algorithm>
#include <stack>
#include <string>
#include <sstream>
using namespace std;
class Solution {
private:
vector<string>& split(const string& s,char delim,vector<string>& elems){
stringstream ss(s);
string item;
while(getline(ss,item,delim)){
/*Extracts characters from is and stores them into str
* until the delimitation character delim is found*/
elems.push_back(item);
}
return elems;
}
public:
vector<string> split(const string& s,char delim){
vector<string> elems;
split(s,delim,elems);
return elems;
}
public:
string simplifyPath(string path) {
string result;
vector<string> elems=split(path,'/');
int ignor=0;
for(int i=elems.size()-1;i>=0;i--){
if(elems[i]==""||elems[i]=="."){
continue;
}
if(elems[i]==".."){
ignor++;
continue;
}
if(ignor>0){
ignor--;
continue;
}
if(result.size()==0){
result = "/"+elems[i];
}else{
result ="/"+elems[i]+result;
}
}
return result.size()?result:"/";
}
};
int main(int argc,char** argv){
Solution res;
string path("/a/./b/../../c/");
cout<<path<<" : "<<res.simplifyPath(path) <<endl;
}