LeetCode 71. 简化路径,经典栈应用题。
思路
- 按
/分割路径字符串 - 用栈处理每个部分:
- 空字符串或
.→ 忽略 ..→ 栈非空则弹出(返回上一级)- 其他 → 入栈
- 空字符串或
- 栈中剩余元素用
/连接,前面补/
Java 实现
classSolution{publicStringsimplifyPath(Stringpath){Deque<String>stack=newArrayDeque<>();// 按 / 分割for(Stringpart:path.split("/")){if(part.isEmpty()||".".equals(part)){// 空字符串(多个/)或当前目录,忽略continue;}if("..".equals(part)){// 返回上一级,栈非空则弹出if(!stack.isEmpty()){stack.pollLast();}}else{// 有效目录名,入栈stack.offerLast(part);}}// 拼接结果StringBuildersb=newStringBuilder();for(Stringdir:stack){sb.append("/").append(dir);}returnsb.length()==0?"/":sb.toString();}}关键点
| 情况 | 处理 |
|---|---|
多个/ | split("/")产生空字符串,直接忽略 |
. | 当前目录,忽略 |
.. | 栈非空则pollLast(),模拟返回上级 |
| 普通目录名 | offerLast()入栈 |
| 根目录 | 栈为空时返回"/" |
复杂度
- 时间复杂度:O(n),n 为路径长度
- 空间复杂度:O(n),栈的空间