力扣题目
解题思路
java代码
力扣题目:
给你一个字符串 path
,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/'
开头),请你将其转化为 更加简洁的规范路径。
在 Unix 风格的文件系统中规则如下:
- 一个点
'.'
表示当前目录本身。 - 此外,两个点
'..'
表示将目录切换到上一级(指向父目录)。 - 任意多个连续的斜杠(即,
'//'
或'///'
)都被视为单个斜杠'/'
。 - 任何其他格式的点(例如,
'...'
或'....'
)均被视为有效的文件/目录名称。
返回的 简化路径 必须遵循下述格式:
- 始终以斜杠
'/'
开头。 - 两个目录名之间必须只有一个斜杠
'/'
。 - 最后一个目录名(如果存在)不能 以
'/'
结尾。 - 此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含
'.'
或'..'
)。
返回简化后得到的 规范路径 。
解题思路:
算法原理:
这道题通过对给定的路径字符串进行解析和处理,来简化路径。
思路:
- 将路径字符串按照
/
分割成各个部分。 - 遍历这些部分,如果是
..
且当前结果字符串有内容,就删除最后一个/
及其后面的部分;如果不是.
且不为空字符串,就在结果字符串中添加/
和该部分。 - 最后根据结果字符串的长度返回相应的简化路径。
代码分析:
- 通过
split
方法将路径分割为字符串数组。 - 使用
for-each
循环遍历数组进行处理。 - 根据不同情况修改结果字符串。
时间复杂度:O(n),其中 n
是路径字符串的长度。主要的时间消耗在遍历和字符串操作上,与输入字符串的长度成正比。
空间复杂度:O(n),用于存储分割后的字符串数组和构建的结果字符串,最坏情况下它们的长度都可能接近输入字符串的长度。
java代码:
package com.example.lib;
public class Leetcode71 {
public static void main(String[] args) {
System.out.println(simplifyPath("/a/./b/../../c/"));
}
public static String simplifyPath(String path) {
String[] paths = path.split("/");
StringBuilder sb = new StringBuilder();
for (String s : paths) {
if (s.equals("..")) {
if (sb.length() > 0) {
int index = sb.lastIndexOf("/");
sb.delete(index, sb.length());
}
} else if (!s.equals(".") && !s.equals("")) {
sb.append("/");
sb.append(s);
}
}
return sb.length() == 0 ? "/" : sb.toString();
}
}
更多详细内容同步到公众号,感谢大家的支持!
每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项