Given an absolute path for a file (Unix-style), simplify it. Or in other words, convert it to the canonical path.
In a UNIX-style file system, a period .
refers to the current directory. Furthermore, a double period ..
moves the directory up a level.
Note that the returned canonical path must always begin with a slash /
, and there must be only a single slash /
between two directory names. The last directory name (if it exists) must not end with a trailing /
. Also, the canonical path must be the shortest string representing the absolute path.
Example 1:
Input: "/home/" Output: "/home" Explanation: Note that there is no trailing slash after the last directory name.
Example 2:
Input: "/../" Output: "/" Explanation: Going one level up from the root directory is a no-op, as the root level is the highest level you can go.
思路: 就是先用 / 分隔符split string,之后遇见 ".." stack不为空,pop,然后除了 "", "." ,".." 之外所有的字符,入栈。
最后用 "/" + stack.pop(),把string逆序连起来,如果sb最后为空,那么返回 "/"; 这题其实就是个stack的题目;
class Solution {
public String simplifyPath(String path) {
if(path == null || path.length() == 0) {
return path;
}
Stack<String> stack = new Stack<>();
String[] splits = path.split("/");
HashSet<String> skipSet = new HashSet<>();
skipSet.add("..");
skipSet.add(".");
skipSet.add(""); // since // will introduce "";
for(String split: splits) {
if(split.equals("..") && !stack.isEmpty()) {
stack.pop();
} else {
if(skipSet.contains(split)) {
continue;
}
stack.push(split);
}
}
StringBuilder sb = new StringBuilder();
while(!stack.isEmpty()) {
String str = stack.pop();
sb.insert(0, "/" + str);
}
return sb.length() == 0 ? "/" : sb.toString();
}
}