Featured image of post Simplify Path

Simplify Path

71. 简化路径

分析

  1. 追加斜杠便于分割:

    • 为避免手动处理路径末尾的文件夹,先在路径末尾添加一个 '/'。这样每个目录(或命令)都会被完整处理
  2. 逐字符遍历构建当前目录:

    • 遇到非 '/' 字符时,累积到 cur,表示当前目录名
    • 遇到 '/' 时,处理当前累积的 cur
      • "..":回退到上一级目录
      • "." 或空字符串:忽略
      • 普通目录名:追加到结果路径 res
  3. 处理返回结果:

    • 如果结果字符串 res 为空,返回根目录 '/';否则返回简化后的路径

时间复杂度

时间复杂度 O(n)

空间复杂度

空间复杂度为 O(n)

C++代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Solution
{
public:
    string simplifyPath(string path)
    {
        std::string res, cur;

        // 1. 确保末尾有 '/',方便处理最后一个目录
        if (path.back() != '/')
            path += '/';

        // 2. 遍历路径
        for (char c : path)
        {
            if (c != '/')  // 累积目录名
                cur += c;
            else  // 遇到 '/',处理当前目录
            {
                if (cur == "..")  // 返回上一级目录
                {
                    // 删除上一级目录
                    while (!res.empty() && res.back() != '/')
                        res.pop_back();  // 删除目录名

                    if (!res.empty())
                        res.pop_back();  // 删除 '/'
                }
                else if (cur != "." && !cur.empty())  // 忽略 "." 和空字符串
                {
                    res += "/" + cur;  // 加入新目录
                }
                cur.clear();  // 重置当前目录
            }
        }

        // 3. 返回结果
        return res.empty() ? "/" : res;
    }
};
Built with Hugo
Theme Stack designed by Jimmy