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) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int i,j,k;
int length=path.size();
int *p=new int[length];
memset(p,0,sizeof(int)*length);
string newpath(length,'\0');
for(i=0,j=0,k=0 ; i<length ; ){
switch (path[i]){
case '/':
if(k!=1){
newpath[k]='/';
p[j++]=k++;
}
for( ; i<length && path[i]=='/' ; i++);
break;
case '.':
if(i+1==length){
i++;
break;
}
if(path[i+1]=='.'){
j=j-2<=0?0:j-2;
k=p[j++]+1;
for(i+=3;i<length && path[i]=='/';i++);
}
else if(path[i+1]=='/'){
i++;
for( ; i<length && path[i]=='/' ; i++);
}
else{
newpath[k++]=path[i++];
}
break;
default:
newpath[k++]=path[i++];
}
}
for(k-- ;k!=0 && newpath[k]=='/' ;k--);
newpath.resize(k+1);
return newpath;
}
};