题目
-
概述:给定一个绝对路径,简化它,简化规则如下:
- 消去'.'('.'表示当前目录本身
- 消去'..'('..'表示上一级)
- 消去重复的'/'
- 路径开头必须为'/'
- 消去路径结尾的'/'
思路
由于需要存储之前的路径,使得以后能够返回,所以考虑用栈实现
用一个字符串变量temp存储'/'之间的字符串,则输入的字符串类型总共有种,分别为'/','.','..',普通字符串
-
遍历字符串(若字符串末尾不为"/"则在末尾补一个"/":
-
'/' :
若栈为空则将"/"入栈
- temp为空 => 不处理
- temp == '.' => 不处理
- temp == 普通字符串 => temp入栈,"/"入栈
- temp == '..':栈顶元素出栈
- 若此时栈为空,则将"/"入栈
- 若此时栈不为空,则将栈顶元素出栈
清空temp
其它字符都拼接到temp中
-
将栈顶元素依次出栈并逆序拼接
若最终字符串末尾为"/"且长度大于1,则将末尾的"/"消去
代码
class Solution {
public String simplifyPath(String path) {
if (path == null || "".equals(path)) {
return "/";
}
LinkedList<String> stack = new LinkedList<>();
StringBuilder result = new StringBuilder();
StringBuilder temp = new StringBuilder();
stack.push("/");
if ('/' != path.charAt(path.length() - 1)) {
path = path + "/";
}
for (char c : path.toCharArray()) {
switch (c) {
case '/':
switch (temp.toString()) {
case "":
case ".":
break;
case "..":
stack.pop();
if (stack.isEmpty()) {
stack.push("/");
} else {
stack.pop();
}
break;
default:
stack.push(temp.toString());
stack.push("/");
break;
}
temp = new StringBuilder();
break;
default:
temp.append(c);
break;
}
}
while (!stack.isEmpty()) {
result.insert(0, stack.pop());
}
if (result.length() > 1 && '/' == result.charAt(result.length() - 1)) {
result.deleteCharAt(result.length() - 1);
}
return result.toString();
}
}