一、题目
1、题目描述
给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 ‘/’ 开头),请你将其转化为更加简洁的规范路径。
在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,‘//’)都被视为单个斜杠 ‘/’ 。 对于此问题,任何其他格式的点(例如,‘…’)均被视为文件/目录名称。
请注意,返回的 规范路径 必须遵循下述格式:
始终以斜杠 ‘/’ 开头。
两个目录名之间必须只有一个斜杠 ‘/’ 。
最后一个目录名(如果存在)不能 以 ‘/’ 结尾。
此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 ‘.’ 或 ‘…’)。
返回简化后得到的 规范路径 。
示例 1:
输入:path = “/home/”
输出:“/home”
解释:注意,最后一个目录名后面没有斜杠。
示例 2:
输入:path = “/…/”
输出:“/”
解释:从根目录向上一级是不可行的,因为根目录是你可以到达的最高级。
示例 3:
输入:path = “/home//foo/”
输出:“/home/foo”
解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。
示例 4:
输入:path = “/a/./b/…/…/c/”
输出:“/c”
2、基础框架
- C++版本给出的基础框架如下:
3、原题链接
https://leetcode.cn/problems/simplify-path/
二、解题报告
1、思路分析
(
1
)
(1)
(1)将字符串通过"/“进行分割得到字符串数组。
(
2
)
(2)
(2)创建栈list,遍历字符串数组,如果遇到”…“,并且栈中有值,则出栈。如果遇到非”“和非”.“,则将当前字符串拼接在”/“之后入栈。
(
3
)
(3)
(3)遍历结束后如果栈为空,则入栈”/"
(
4
)
(4)
(4)最后将栈中所有元素进行拼接。
2、时间复杂度
时间复杂度为O(n),空间复杂度为O(N)
3、代码详解
class Solution {
public String simplifyPath(String path) {
String[] s = path.split("/");
List<String> list = new ArrayList<>();
for (int i = 0; i < s.length; i++) {
if ("..".equals(s[i])){
if(list.size() > 0) {
list.remove(list.size()-1);
list.remove(list.size()-1);
}
}
else if (!"".equals(s[i]) && !".".equals(s[i])) {
list.add("/");
list.add(s[i]);
}
}
if (list.size() == 0) return "/";
String re = "";
for (int i = 0; i < list.size(); i++) {
re += list.get(i);
}
return re;
}
}
三、本题小知识
1.注意字符串的比较,要用equals