【题目】
Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/"
, => "/home"
path = "/a/./b/../../c/"
, => "/c"
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"
.
【题意】
给定一个unix下的绝对路径,简化路径
【思路】
根目录为/
'.'表示留在当前目录
'..'表示回到上级目录
维护一个栈,来模拟实际的目录进入和返回过程,最后留在栈中的即为目标path,组织成字符串即可输出
注意一种特殊情况:
1. /../ ==> /
2. /a//b ==> /a/b
【代码】
class Solution {
public:
string simplifyPath(string path) {
string result="";
stack<string>st;
int len = path.length();
if(len==0)return result;
string curdir="";
for(int i=0; i<len; i++){
if(path[i]=='/'){
if(curdir!=""){
// 识别出一个目录,与栈顶元素比较,判断是否入栈
if(curdir==".."){
if(!st.empty()) st.pop(); //如果当前是.. 那么只有在当前栈非空的时候,栈顶元素才会出栈
}
else if(curdir!=".") st.push(curdir); //如果当前是有效的单词串,则直接入栈。'.'跳过不考虑
}
curdir="";
}
else{
curdir+=path[i];
}
}
//别忘了最后一个目录
if(curdir!=""){
// 识别出一个目录,与栈顶元素比较,判断是否入栈
if(curdir==".."){
if(!st.empty()) st.pop(); //如果当前是.. 那么只有在当前栈非空的时候,栈顶元素才会出栈
}
else if(curdir!=".") st.push(curdir); //如果当前是有效的单词串,则直接入栈。'.'跳过不考虑
}
//输出简化后的path
while(!st.empty()){
result = "/" + st.top() + result;
st.pop();
}
if(result=="")result="/"; //如果栈为空,则表示在根目录
return result;
}
};