您的位置:首页 > 其它

LeetCode - Simplify Path

2015-04-04 04:45 288 查看
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"


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里面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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: