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"..
图例
分析
首先熟悉一下Unix-style的路径构成规则:
| 字符 | 含义(英文) | 含义(中文) |
|---|---|---|
| / | root directory | 根目录 |
| / | Directory Separator | 路径分隔符 |
| . | Current Directory | 当前目录 |
| .. | Parent Directory | 上级目录 |
| ~ | Home Directory | 家目录 |
中间是"."的情况直接去掉
是".."时删掉它上面挨着的一个路径
如果是空的话返回"/"
如果有多个"/"只保留一个
那么我们可以把路径看做是由一个或多个"/"分割开的众多子字符串,把它们分别提取出来一一处理即可
代码
// 时间复杂度O(n),空间复杂度O(n)
class Solution {
public String simplifyPath(String path) {
// corner case
if(path.length()<=1) return path;
String[] each = path.split("/");
Stack<String> stack = new Stack<>();
for(String curr : each){
if(curr.equals("..")){
if(!stack.empty()) stack.pop(); // "a", "b", ".." ==> "a" because .. go to partent directory
}else if(!curr.equals(".") && curr.isEmpty()){
stack.push(curr); // regular case
}
}
String result = "";
if(stack.empty()) return"/";
while(!stack.empty()){
String newPop = stack.pop();
result = "/" + newPop + result; // final result
}
return result;
}
}