【leetcode面试经典150题】53. 简化路径(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C++语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致)

【题目描述】

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

在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠 '/' 。 对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。

请注意,返回的 规范路径 必须遵循下述格式:

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

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

【示例一】

复制代码
输入:path = "/home/"
输出:"/home"
解释:注意,最后一个目录名后面没有斜杠。 

【示例二】

复制代码
输入:path = "/../"
输出:"/"
解释:从根目录向上一级是不可行的,因为根目录是你可以到达的最高级。

【示例三】

复制代码
输入:path = "/home//foo/"
输出:"/home/foo"
解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。

【示例四】

复制代码
输入:path = "/a/./b/../../c/"
输出:"/c"

【提示及数据范围】

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

【代码】

cpp 复制代码
// 栈

class Solution {
public:
    string simplifyPath(string path) {
        auto split = [](const string& s, char delim) -> vector<string> {
            vector<string> ans;
            string cur;
            for (char ch: s) {
                if (ch == delim) {
                    ans.push_back(move(cur));
                    cur.clear();
                }
                else {
                    cur += ch;
                }
            }
            ans.push_back(cur);
            return ans;
        };

        vector<string> names = split(path, '/');
        vector<string> stack;
        for (string& name: names) {
            if (name == "..") {
                if (!stack.empty()) {
                    stack.pop_back();
                }
            }
            else if (!name.empty() && name != ".") {
                stack.push_back(name);
            }
        }
        string ans;
        if (stack.empty()) {
            ans = "/";
        }
        else {
            for (string& name: stack) {
                ans += "/" + name;
            }
        }
        return ans;
    }
};
相关推荐
合方圆~小文15 分钟前
AI摄像头精准识别技术依赖于深度算法
数据结构·数据库·数码相机·模块测试
小狗爱吃黄桃罐头22 分钟前
《C++ Primer Plus》模板类 Template 课本实验
c++
无限进步_29 分钟前
C语言数组元素删除算法详解:从基础实现到性能优化
c语言·开发语言·windows·git·算法·github·visual studio
松涛和鸣37 分钟前
16、C 语言高级指针与结构体
linux·c语言·开发语言·数据结构·git·算法
Booksort37 分钟前
【LeetCode】算法技巧专题(持续更新)
算法·leetcode·职场和发展
OJAC11139 分钟前
2026高校毕业生1270万!但这些学生却被名企用高薪“提前预定”!
算法
神秘的猪头41 分钟前
🧠 深入理解 JavaScript Promise 与 `Promise.all`:从原型链到异步编程实战
前端·javascript·面试
Controller-Inversion41 分钟前
岛屿问题(dfs典型问题求解)
java·算法·深度优先
小白程序员成长日记42 分钟前
力扣每日一题 2025.11.28
算法·leetcode·职场和发展
Swift社区1 小时前
LeetCode 435 - 无重叠区间
算法·leetcode·职场和发展