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".
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("");
int Size = path.size();
for (int i=0;i<Size;i++)
{
if (path[i] == '/')
{
if(i == Size-1)
break;
if(path[i+1] == '/') // //跳过第一个/
continue;
int postmp = path.find('/', i+1);
int pos = postmp == string::npos ? Size : postmp;//找出下一个/位置,找不到就是最后位置
string tmp = path.substr(i+1, pos-i-1);//取出两个//中间的东西
//碰到..去掉前面一组
if (tmp == "..")// /..
{
i += 2;
int tmp = res.rfind('/');
if (string::npos != tmp)
res.erase(res.begin()+tmp, res.end());
}
//./跳过
else if (tmp == ".")// /.
{
++i;
continue;
}
else
{
res += path[i++];
while(i<path.size() && path[i] != '/')
{
res += path[i++];
}
--i;
}
}
}
return res.empty()?"/":res;
}
};
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>
#include<stack>
using namespace std;
class Solution1 {
public:
string simplifyPath(string path)
{
string res("");
int Size = path.size();
for (int i=0;i<Size;i++)
{
if (path[i] == '/')
{
if(i == path.size()-1)
break;
if(path[i+1] == '/') // //
continue;
int postmp = path.find('/', i+1);
int pos = postmp == string::npos ? Size : postmp;
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;
}
};
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;
}
};
int main()
{
Solution1 s;
//string str("/../");
string str("/aa/.a/ba/../.../ca/");
cout<<s.simplifyPath(str)<<endl;
}