题目如下:
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".
分析如下:
在解析到"./"的时候可以把它自己消除掉。
在解析到"../"的时候可以把当前读入路径的的一层消除掉, 所以题目需要使用stack的来按照从旧到新的顺序维护当前读入的路径, 从而在需要消除的时候消除栈顶。
首先,root 符号“/”作为一个单位入stack。
然后依次解析原串,比如 path = "/a/./b/../../c/", => "/c", 依次入栈 "/", "a", "b" , 出栈"b", 出栈“a”,入栈 "c"。
注意需要特别处理一下,上面的corner case。如果输入"/../",则返回root.
我的代码:
class Solution {
public:
string simplifyPath(string path) {
int start = 0;
int end = 0;
string result = "";
stack<string> stack;
if (path == "") return "";
stack.push("/");
while (start < path.length()) {
while (start < path.length() && path[start] == '/')
start++; //start-1为最后一个'/'字符
end = start;
while (end < path.length() && path[end] != '/')
end++; // end-1 为最后一个非'/'字符
string each = path.substr(start, end - start);
if (each == "..") {
if (stack.top() != "/")
stack.pop();
} else if (each != "." && each != ""){
stack.push(each);
}
start = end;
}
if (stack.size() == 1) return stack.top(); //return only the root, for some corner case.
while (stack.size() > 1) {
result = "/" + stack.top() + result;
stack.pop();
}
return result;
}
};