Given an absolute path for a file (Unix-style), simplify it.
For example,
path =
path =
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"
.
维护一个栈,对于每一个块(以‘/’作为分界)进行分析,
如果遇到‘../’则表示要上一层,那么就是进行出栈操作,
如果遇到‘./’则是停留当前,直接跳过,其他文件路径则直接进栈即可。
最后根据栈中的内容转换成路径即可(这里是把栈转成数组,然后依次添加)。
时间上不会超过两次扫描(一次是进栈得到简化路径,一次是出栈获得最后结果),所以时间复杂度是O(n),空间上是栈的大小,也是O(n)。
public class Solution { public String simplifyPath(String path) { if(path == null || path.length() == 0) return ""; LinkedListstack = new LinkedList (); StringBuilder res = new StringBuilder(); int i = 0; while(i < path.length()) { int index = i; StringBuilder temp = new StringBuilder(); //divide path by '/' while(i < path.length() && path.charAt(i) != '/') { temp.append(path.charAt(i)); i++; } if(index != i) { String st = temp.toString(); if(st.equals("..")) { if(!stack.isEmpty()) stack.pop(); }else if(!st.equals(".")) stack.push(st); } i++; } if(!stack.isEmpty()) { String[] s = stack.toArray(new String[stack.size()]); for(int j = s.length - 1; j >= 0; j--) { res.append("/" + s[j]); } } if(res.length() == 0) return "/"; return res.toString(); } }
No comments:
Post a Comment