【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;
    }
};
相关推荐
爱吃涮毛肚的肥肥(暂时吃不了版)1 小时前
仿腾讯会议——音频服务器部分
c++·qt·面试·职场和发展·音视频·腾讯会议
智驱力人工智能2 小时前
AI移动监测:仓储环境安全的“全天候守护者”
人工智能·算法·安全·边缘计算·行为识别·移动监测·动物检测
DpHard2 小时前
自用Vscode 配置c++ debug环境
c++·ide·vscode
hy____1233 小时前
C++多态的详细讲解
开发语言·c++
superior tigre3 小时前
C++学习:六个月从基础到就业——C++20:范围(Ranges)进阶
c++·学习·c++20
小葡萄20253 小时前
黑马程序员C++2024版笔记 第0章 C++入门
开发语言·c++·笔记
代码小将3 小时前
力扣992做题笔记
算法·leetcode
编程绿豆侠3 小时前
力扣HOT100之二叉树:199. 二叉树的右视图
算法·leetcode·职场和发展
不二一3 小时前
linux c++头文件生成源文件 使用python脚本 配置vim快捷键
linux·c++·python
GG不是gg3 小时前
B树与B+树全面解析
数据结构·b树·b+树