给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径。
在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠 '/' 。 对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。
请注意,返回的 规范路径 必须遵循下述格式:
始终以斜杠 '/' 开头。
两个目录名之间必须只有一个斜杠 '/' 。
最后一个目录名(如果存在)不能 以 '/' 结尾。
此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 '.' 或 '..')。
返回简化后得到的 规范路径 。
示例 1:
输入:path = "/home/"
输出:"/home"
解释:注意,最后一个目录名后面没有斜杠。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/simplify-path
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
两种输入
- /
- 其它
分情况处理 如果是 / 直接忽略即可
否则继续向下查找直到遇到下一个 / ,中间的字符认为是路径
对于路径 如果只有一个 . 忽略 如果只有两个 . 回退目录 其余情况添加一级目录。
可以用一个 list 表示目录,回退时 list size - 1即可,添加时 list 中 add
class Solution {
public String simplifyPath(String path) {
if (null == path || path.length() <= 0) {
return path;
}
List<String> result = new ArrayList<>();
int i = 1;
int j; StringBuilder sb;
while (i < path.length()) {
char input = path.charAt(i);
switch (input) {
case '.':
j = i;
sb = new StringBuilder();
while (isPath(path, j)) {
sb.append(path.charAt(j));
j++;
}
String r = sb.toString();
if (r.length() > 2) {
result.add(r);
} else if (r.length() == 2) {
if (r.charAt(1) == '.') {
safeBack(result);
} else {
result.add(r);
}
}
i = j;
break;
case '/':
break;
default:
j = i;
sb = new StringBuilder();
while (isPath(path, j)) {
sb.append(path.charAt(j));
j++;
}
result.add(sb.toString());
i = j;
break;
}
i++;
}
if (result.size() < 1) {
return "/";
}
sb = new StringBuilder();
for (i = 0; i < result.size(); i++) {
sb.append("/").append(result.get(i));
}
return sb.toString();
}
private boolean isPath(String path, int i) {
return i < path.length() && path.charAt(i) != '/';
}
private boolean isDot(String path, int i) {
return i < path.length() && path.charAt(i) == '.';
}
private void safeBack(List<String> result) {
Object obj = result.size() == 0 ? null : result.remove(result.size() - 1);
}
}