Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"
题意是给一个关于路径字符串,进行简化,得到最基本的路径字符串。
这是一道基于字符串的题目,同时必须知道一些路径的基本知识,例如”..”表示上一个目录, “.”表示当前目录, 多个”/”可用一个”/”表示,需要注意的是同时当返回到根目录的时候使用”..”返回的依旧是根目录。
使用的方法是用vector<string> dir
来存储输入的目录,先处理”.”,遇到目录为”.”,可以直接用erase
方法删除,然后再处理”..”,直接遍历dir
,用另外一个vector<string> re_dir
来存储处理后的目录, 当遇到”..”, 直接使用pop_back
, 如果不是,则加入到该向量中。
代码:
string simplifyPath(string path)
{
string re;
vector<string> dir;
path+="/"; //保证当只有一个dir的时候会被存储到dir
string temp="";
for(int i=0;i<path.size();i++)
{
if(path[i]=='/')
{
//reverse(temp.begin(), temp.end());
dir.push_back(temp);
temp="";
}
else{
temp+=path[i];
}
}
//处理.
vector<string>::iterator it=dir.begin();
while(it!=dir.end())
{
if(*it==".")
{
it=dir.erase(it);//erase 指向下一个元素
}
else{
it++;
}
}
//处理..
vector<string> re_dir;
for(int i=0;i<dir.size();i++)
{
if(dir[i]=="..")
{
if(re_dir.size()!=0)
re_dir.pop_back();
}
else if(dir[i].size()!=0)
{
re_dir.push_back(dir[i]);
}
}
for(int i=0;i<re_dir.size();i++)
{
re+="/"+re_dir[i];
}
if(re.size()==0)
{
return "/";
}
return re;
}