Simplify Path
Total Accepted: 49930 Total Submissions: 228873 Difficulty: Medium
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存之前的dir,当遇到..时pop
- 这个题不难,但是debug花了很久时间,最后发现是,自己判断空的substring的时候,用的是 str == null
- 但是其实应该用str.equals(""),空是"",而不是null
public class Solution {
public String simplifyPath(String path) {
if (path == null || path.length() == 0) {
return new String();
}
int size = path.length();
Stack<String> stack = new Stack<String>();
int i = 0;
while (i < size) {
int j = i + 1;
while (j < size && path.charAt(j) != '/') {
j++;
}
String dir = path.substring(i + 1, j);
i = j;
if (dir.equals("") || dir.equals("/") || dir.equals(".")) {
continue;
} else if (dir.equals("..")) {
if (!stack.isEmpty()) {
stack.pop();
}
} else {
stack.push(dir);
}
}
List<String> list = new ArrayList<String>();
if (stack.isEmpty()) {
return new String("/");
}
while (!stack.isEmpty()) {
list.add(stack.pop());
}
StringBuilder sb = new StringBuilder();
for (i = list.size() - 1; i >= 0; i--) {
sb.append("/");
sb.append(list.get(i));
}
return sb.toString();
}
}