https://leetcode.com/problems/simplify-path/
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"
.
这道题就是利用栈,把所有的 ‘/’ 都略过,只看斜杠中间的字符串,如果是 “.” 就啥也不做,如果是“..”就从stack里面pop一个元素,如果stack这时候是空的,就啥也不做,如果是别的,就push到stack里面,到最后根据stack写出simplified path,注意这时候stack存储的path顺序是反的,所以每次要往前加,而不是在后面加。
注意这里因为输入都是absolute path,所以不会有'../ab'这种情况
public String simplifyPath(String path) {
if(path == null || path.length()==0) return "";
Stack<String> stack = new Stack<String>();
int i=0;
while(i<path.length()){
while(i<path.length() && path.charAt(i)=='/') i++;
if(i==path.length()) break;
int j=i;
while(j<path.length() && path.charAt(j)!='/') j++;
String current = path.substring(i, j);
i=j;
if(current.equals(".")) continue;
else if(current.equals("..")){
if(!stack.empty()) stack.pop();
}
else stack.push(current);
}
if(stack.empty()) return "/";
StringBuilder sb = new StringBuilder();
while(!stack.empty()){
sb.insert(0, stack.pop());
sb.insert(0, '/');
}
return sb.toString();
}