Given an absolute path for a file (Unix-style), simplify it.
For example,
path ="/home/", =>"/home"
path ="/a/./b/…/…/c/", =>"/c"
click to show corner cases.
Corner Cases:
Did you consider the case where path ="/…/"?
In this case, you should return"/".
Another corner case is the path might contain multiple slashes’/'together, such as"/home//foo/".
In this case, you should ignore redundant slashes and return"/home/foo".
class Solution {
public:
string simplifyPath(string path)
{
string res("");
for (int i=0;i<path.size();i++)
{
if (path[i] == '/')
{
if(i == path.size()-1)
break;
if(path[i+1] == '/') // //
continue;
int pos = Find(path, i+1);
string tmp = path.substr(i+1, pos-i-1);
string str1("..");
string str2(".");
if (tmp== str1)// /..
{
i += 2;
int tmp = res.rfind('/');
if (string::npos != tmp)
res.erase(res.begin()+tmp, res.end());
}
else if (tmp== str2)// /.
{
++i;
continue;
}
else
{
res += path[i++];
while(i<path.size() && path[i] != '/')
{
res += path[i++];
}
--i;
}
}
}
if (0 == res.size())
res += '/';
return res;
}
int Find(string path, int start)
{
string s = path.substr(start);
int tmp = s.find('/');
if (string::npos == tmp)
return path.size();
return tmp + start;
}
};
class Solution {
public:
string simplifyPath(string path)
{
string res("");
int i=0;
while (i<path.size())
{
while (path[i] == '/' && i < path.size()) ++i;
if(i == path.size())
break;
int start = i;
while (path[i] != '/' && i < path.size()) ++i;
int end = i-1;
string tmp = path.substr(start, end - start + 1);
if (tmp== "..")// /..
{
int tmp = res.rfind('/');
if (string::npos != tmp)
res.erase(res.begin()+tmp, res.end());
}
else if (tmp != ".")// /.
{
res += '/';
res += tmp;
}
}
return res.empty()?"/":res;
}
};
测试
#include<iostream>
#include<string>
using namespace std;
class Solution1 {
public:
string simplifyPath(string path)
{
string res("");
for (int i=0;i<path.size();i++)
{
if (path[i] == '/')
{
if(i == path.size()-1)
break;
if(path[i+1] == '/') // //
continue;
int pos = Find(path, i+1);
cout<<"pos :"<<pos<<" i :"<<i<<endl;
string tmp = path.substr(i+1, pos-i-1);
cout<<"tmp :"<<tmp<<endl;
string str1("..");
string str2(".");
if (tmp== str1)// /..
{
int tmp = res.rfind('/');
if (string::npos != tmp)
res.erase(res.begin()+tmp, res.end());
}
else if (tmp== str2)// /.
{
continue;
}
else
{
res += path[i++];
while(i<path.size() && path[i] != '/')
{
res += path[i++];
}
--i;
}
}
}
if (0 == res.size())
res += '/';
return res;
}
int Find(string path, int start)
{
string s = path.substr(start);
int tmp = s.find('/');
if (string::npos == tmp)
return path.size();
return tmp + start;
}
};
class Solution {
public:
string simplifyPath(string path)
{
string res("");
int i=0;
while (i<path.size())
{
cout<<" i :"<<i<<endl;
while (path[i] == '/' && i < path.size()) ++i;
if(i == path.size())
break;
int start = i;
while (path[i] != '/' && i < path.size()) ++i;
int end = i-1;
string tmp = path.substr(start, end - start + 1);
if (tmp== "..")// /..
{
int tmp = res.rfind('/');
if (string::npos != tmp)
res.erase(res.begin()+tmp, res.end());
}
else if (tmp != ".")// /.
{
res += '/';
res += tmp;
}
}
return res.empty()?"/":res;
}
};
int main()
{
Solution s;
string str("/../");
cout<<s.simplifyPath(str)<<endl;
}