【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;
    }
};
相关推荐
DARLING Zero two♡1 分钟前
C++底层学习预备:模板初阶
开发语言·c++·模板
和风化雨5 分钟前
排序算法--希尔排序
c语言·数据结构·c++·算法·排序算法
sjsjs1131 分钟前
【数据结构-Trie树】力扣677. 键值映射
数据结构·算法·leetcode
windwind200031 分钟前
对游戏宣发的粗浅思考
游戏·职场和发展·创业创新·个人开发·游戏策划
肖田变强不变秃41 分钟前
自研有限元软件与ANSYS精度对比-Bar2D2Node二维杆单元模型-四连杆实例
c++·有限元·ansys
0x7F7F7F7F42 分钟前
图论——spfa判负环
算法·图论
一只自律的鸡43 分钟前
数据结构 前缀中缀后缀
数据结构
励志成为美貌才华为一体的女子44 分钟前
python算法和数据结构刷题[6]:二叉树、堆、BFS\DFS
数据结构·算法
wclass-zhengge1 小时前
04树 + 堆 + 优先队列 + 图(D1_树(D10_决策树))
数据结构·算法
YxVoyager2 小时前
OpenGL学习笔记(七):Camera 摄像机(视图变换、LookAt矩阵、Camera类的实现)
c++·笔记·图形渲染