题目:
Given an absolute path for a file (Unix-style), simplify it.
给一个文件(Unix风格)的绝对路径,简化这个路径。
For example,
path = "/home/"
, => "/home"
path = "/a/./b/../../c/"
, => "/c"
linux中,/表示根目录, .表示当前目录,..表示当前目录的上一目录,比如 /a/.. 表示/ , /a/. 表示 /a
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"
.
思路:
把 / 之后的string存储在一个 vector<string> 内,如果遇到“.." ,则把vector内的最后一个string删掉,模拟栈,如果遇到”.“,则什么都不做,最后把vector内的string依次在前面加上”/",即是所求的简化路径。
代码:
class Solution {
public:
string simplifyPath(string path)
{
vector<string> nameVect;//存储路径中的名字
string name;//当前两个'/'之间的名字
path.push_back('/');//从后面的代码可以发现,把name加入nameVect的条件是遇到'/',因此在path最后加上'/',防止最后一个name没有加入nameVect
for(int i=0;i<path.size();i++)
{
//name是在这个'/'之前的,即在遇到'/'时,判断之前的name是'..',还是'.',或者是正常路径
if(path[i]=='/')
{
//如果'/'前面的name为空,即当遇到路径的首字符或者连续几个'/'时
if(name.size()==0)
continue;
//如果'/'前面的name为"..",则把namevect的最后一个删掉
if(name=="..")
{
if(nameVect.size()>0)
nameVect.pop_back();
}
else
//如果'/'前面的name为".",则什么都不做继续遍历
if(name==".")
{
}
//如果'/'前面的name为正常路径,则把name入栈
else
{
nameVect.push_back(name);
}
name.clear();
}
else
{
name.push_back(path[i]);//record the name
}
}
string result;
if(nameVect.empty())
return "/";
for(int i=0;i<nameVect.size();i++)
{
result.append("/"+nameVect[i]);
}
return result;
}
};