【leetcode】【71】Simplify Path

本文深入解析了路径简化的算法逻辑,包括如何通过栈结构处理路径中的符号,以及如何有效处理冗余斜杠和特殊路径符号,如 '..' 和 './' 的操作。详细介绍了算法的时间复杂度为 O(n),并提供了相应的 Java 实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题描述

Given an absolute path for a file (Unix-style), simplify it.

For example,
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"

click to show corner cases.

Corner Cases:

  • Did you consider the case where path = "/../"?
    In this case, you should return "/".
  • Another corner case is the path might contain multiple slashes '/' together, such as "/home//foo/".
    In this case, you should ignore redundant slashes and return "/home/foo".

二、问题分析

Corner cases给出了很多需要考虑的点。"/a/./b/../../c/", => "/c"分析过程:先是a,然后‘.’路径不变,再是b变为/a/b,接下来‘..’,变为/a等等,我们可以发现所有的操作均是在路径的尾,考虑一下只有一头操作的数据结构,我们会发现stack刚好符合。然后我们需要考虑的就是如何获取/xxx/中xxx的部分,容易发现字符串以‘/’来分割,因此可以使用split方法。时间复杂度为O(n)。

三、Java AC代码

public String simplifyPath(String path) {
		StringBuilder sb = new StringBuilder();
		LinkedList<String> stack = new LinkedList<String>();
		String[] strs = path.split("/+");
		for (String str : strs) {
			if (str.equals("") || str.equals(".")) {
				continue;
			}
			if (str.equals("..")) {
				if (!stack.isEmpty()) {
					stack.pop();
				}
			} else if (!str.equals(".")) {
				stack.push(str);
			}
		}
		if (stack.isEmpty()) {
			return "/";
		}
		while(!stack.isEmpty()){
			sb.append("/"+stack.removeLast());
		}
		return sb.toString();
	}


### LeetCode Problem 71 Simplify Path Problem 71 on LeetCode is titled "Simplify Path," which involves simplifying a given Unix-style path to its canonical form. The task does not directly involve stacks as the primary data structure, but one can implement solutions that utilize stack-like behavior or other methods. The goal of this problem is to convert an absolute path into its simplest and most normalized form by resolving `..` (parent directory), `.` (current directory), and multiple slashes (`//`). For instance: - Input: `/home/` - Output: `/home` A common approach uses string manipulation techniques rather than explicitly implementing a stack from scratch like in some problems such as those mentioned in another context[^2]. However, understanding how paths are processed could be analogous to operations performed when managing elements within a stack where directories might be pushed onto or popped off depending on whether they represent moving up or down through filesystem levels. For solving this particular challenge without focusing specifically on traditional stack implementation details found elsewhere [^3]: ```cpp #include <iostream> #include <sstream> #include <vector> using namespace std; string simplifyPath(string path) { stringstream ss(path); vector<string> tokens; string token, res = "", prev; while(getline(ss,token,'/')){ if(token==".." && !tokens.empty()) tokens.pop_back(); else if((!token.empty())&&(token!=".")&&(token!="..")) tokens.push_back("/"+token); } for(auto& s : tokens){ res += s; } return res.empty()? "/":res; } ``` This code snippet demonstrates handling various cases including consecutive slashes, current-directory symbols `.`, parent-directory symbols `..`. It iterates over parts split by slash characters, applying rules similar to pushing valid segments onto a list (acting similarly to a stack's functionality) and popping them upon encountering double dots indicating upward traversal beyond root level isn't possible thus ignored implicitly during construction phase only adding non-empty strings representing actual traversals back together forming final simplified result.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值