当前位置: 首页 > news >正文

leetcode71:简化路径

给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为 更加简洁的规范路径

在 Unix 风格的文件系统中规则如下:

  • 一个点 '.' 表示当前目录本身。
  • 此外,两个点 '..' 表示将目录切换到上一级(指向父目录)。
  • 任意多个连续的斜杠(即,'//' 或 '///')都被视为单个斜杠 '/'
  • 任何其他格式的点(例如,'...' 或 '....')均被视为有效的文件/目录名称。

返回的 简化路径 必须遵循下述格式:

  • 始终以斜杠 '/' 开头。
  • 两个目录名之间必须只有一个斜杠 '/' 。
  • 最后一个目录名(如果存在)不能 以 '/' 结尾。
  • 此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 '.' 或 '..')。

返回简化后得到的 规范路径 。

示例 1:

输入:path = "/home/"

输出:"/home"

解释:

应删除尾随斜杠。

示例 2:

输入:path = "/home//foo/"

输出:"/home/foo"

解释:

多个连续的斜杠被单个斜杠替换。

示例 3:

输入:path = "/home/user/Documents/../Pictures"

输出:"/home/user/Pictures"

解释:

两个点 ".." 表示上一级目录(父目录)。

示例 4:

输入:path = "/../"

输出:"/"

解释:

不可能从根目录上升一级目录。

示例 5:

输入:path = "/.../a/../b/c/../d/./"

输出:"/.../b/d"

解释:

"..." 在这个问题中是一个合法的目录名。

提示:

  • 1 <= path.length <= 3000
  • path 由英文字母,数字,'.''/' 或 '_' 组成。
  • path 是一个有效的 Unix 风格绝对路径。

步骤1:问题定义

输入:

  • 一个字符串 path,表示 Unix 风格的绝对路径。

输出:

  • 一个字符串,表示简化后的规范路径。

计算问题性质:

  • 将输入的绝对路径字符串转换为一个简化的路径字符串,遵循 Unix 文件系统的规则。

限制条件:

  • 输入字符串长度在 1 到 3000 之间。
  • 字符串由英文字母、数字、‘.’、‘/’ 或 ‘_’ 组成。
  • 字符串是一个有效的 Unix 风格绝对路径。

边界条件:

  • 输入路径可能以 ‘/’ 结尾,需要处理。
  • 输入路径可能包含多个连续的 ‘/’,需要合并。
  • 输入路径可能包含 ‘.’ 或 ‘…’,需要根据规则处理。
  • 输入路径可能为空或仅包含 ‘/’。

步骤2:解题步骤

  1. 将输入路径按照 ‘/’ 分割成多个部分。
  2. 遍历分割后的部分,忽略空字符串和 ‘.’。
  3. 遇到 ‘…’ 时,如果栈不为空,则弹出栈顶元素(返回上一级目录)。
  4. 将非 ‘.’ 和 ‘…’ 的部分压入栈中。
  5. 将栈中的元素连接成字符串,每个元素之间用 ‘/’ 分隔。
  6. 如果栈为空,返回根目录 ‘/’。

算法设计思路:

  • 使用栈来处理路径的层级结构,因为栈的后进先出特性符合目录的上下级关系。

时间复杂度:O(n),其中 n 是输入路径的长度,因为每个字符最多被处理两次(分割和压栈/弹栈)。 空间复杂度:O(n),最坏情况下栈中可能包含所有分割后的部分。

步骤3:C++ 代码实现

步骤4:启发

  • 使用栈处理具有层级结构的数据是一种常见且有效的方法。
  • 在处理字符串问题时,可以使用 istringstream 和 getline 方便地分割字符串。
  • 算法的优化可以考虑减少不必要的字符串操作,例如直接在输入字符串上操作,而不是创建多个字符串副本。

步骤5:实际应用

应用场景:文件系统路径解析

  • 在文件系统中,用户输入的路径需要被解析并转换为实际的文件或目录路径。
  • 例如,在开发文件浏览器或命令行工具时,用户可能输入复杂的路径字符串,程序需要将其简化并定位到正确的文件或目录。

具体实现:

  • 在文件浏览器中,用户输入的路径字符串通过 simplifyPath 函数处理后,可以用来导航到正确的文件或目录。
  • 在命令行工具中,简化后的路径可以用于执行文件操作,如复制、移动或删除文件。

http://www.lryc.cn/news/474605.html

相关文章:

  • nodejs入门教程4:nodejs创建第一个应用
  • 启用 iPhone 原生的五笔输入
  • 这个工具让你轻松开发一个带AI功能的Notion
  • 光耦合器的关键作用和创新---腾恩科技
  • 穿越死锁的迷雾:pthread_mutex_lock的终极挑战与破解策略
  • Dockerfile制作Oracle19c镜像
  • 【时间之外】IT人求职和创业应知【23】
  • 后端:Spring-1
  • OTX系统架构分析
  • ASO如何低预算进行优化
  • 非线性数据结构之数
  • 个人开发三步走
  • qt QAction详解
  • 建立maven项目常见问题解决办法
  • Windows 10 安装使用Docker踩过的坑和解决-31/10/2024
  • 微服务之间的调用关系
  • Chinese Spelling Correction as Rephrasing Language Model(AAAI2024)
  • DirectShow过滤器开发-写MP3音频文件过滤器(再写 写MP3)
  • 文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《基于对等架构的虚拟电厂-配电网双层电碳协同调度模型》
  • 大数据-204 数据挖掘 机器学习理论 - 混淆矩阵 sklearn 决策树算法评价
  • Fsm1
  • C. Gorilla and Permutation
  • 从0开始学python-day17-数据结构2
  • (蓝桥杯C/C++)—— 编程基础
  • 企业物流管理数据仓库建设的全面指南
  • 数据采集-Kepware 安装证书异常处理
  • ubuntu禁止自动更新设置
  • Rust 力扣 - 1461. 检查一个字符串是否包含所有长度为 K 的二进制子串
  • C#/.NET/.NET Core技术前沿周刊 | 第 11 期(2024年10.21-10.31)
  • unity 三维数学 ,角度 弧度计算