题目描述#
给定一个 Unix 风格的绝对路径 path,要求把它转换成规范路径。
规范路径需要满足:以 / 开头,目录之间只有一个 /,末尾不能带多余的 /,并且结果中不能保留 . 或 .. 这样的特殊目录标记。
思路#
这道题也适合用栈来做,因为路径的处理过程本质上就是“进入一个目录”和“回到上一级目录”。
先用 strings.Split(paths, "/") 按斜杠拆分路径。这样连续的多个 / 会被拆出空字符串,正好可以在遍历时直接跳过。遍历每一段时,如果当前片段是空串或者 .,说明它对路径没有实际影响,继续往后处理即可。
如果当前片段不是 ..,那它就是一个有效目录名,直接压入栈中。这样栈里始终保存的是当前规范路径上从左到右的目录顺序。
如果当前片段是 ..,含义是回到上一级目录。这时只需要判断栈是否为空:如果栈里还有目录,就弹出栈顶;如果栈已经为空,说明当前已经在根目录,再往上也还是根目录,不需要做额外处理。
最后把栈中的目录用 / 拼接起来,并在最前面补上根目录的 /,就得到了最终的规范路径。
这个做法的时间复杂度是 O(n),空间复杂度是 O(n),其中 n 是字符串长度。
代码#
import "strings"
func simplifyPath(paths string) string {
path := strings.Split(paths, "/")
stack := []string{}
for _, s := range path {
if s == "" || s == "." {
continue
}
if s != ".." {
stack = append(stack, s)
} else if len(stack) > 0 {
stack = stack[:len(stack)-1]
}
}
return "/" + strings.Join(stack, "/")
}