{
  "type": "code_options",
  "author": "https://github.com/begeekmyfriend/leetcode",
  "source": "solution.md",
  "exercise_id": "4f4a298d07b14920a0c442fae663c09c",
  "keywords": "栈,字符串",
  "title": "简化路径",
  "desc": [
    {
      "content": "\n<p>给你一个字符串 <code>path</code> ，表示指向某一文件或目录的 Unix 风格 <strong>绝对路径 </strong>（以 <code>'/'</code> 开头），请你将其转化为更加简洁的规范路径。</p><p class=\"MachineTrans-lang-zh-CN\">在 Unix 风格的文件系统中，一个点（<code>.</code>）表示当前目录本身；此外，两个点 （<code>..</code>） 表示将目录切换到上一级（指向父目录）；两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠（即，<code>'//'</code>）都被视为单个斜杠 <code>'/'</code> 。 对于此问题，任何其他格式的点（例如，<code>'...'</code>）均被视为文件/目录名称。</p><p>请注意，返回的 <strong>规范路径</strong> 必须遵循下述格式：</p><ul>\t<li>始终以斜杠 <code>'/'</code> 开头。</li>\t<li>两个目录名之间必须只有一个斜杠 <code>'/'</code> 。</li>\t<li>最后一个目录名（如果存在）<strong>不能 </strong>以 <code>'/'</code> 结尾。</li>\t<li>此外，路径仅包含从根目录到目标文件或目录的路径上的目录（即，不含 <code>'.'</code> 或 <code>'..'</code>）。</li></ul><p>返回简化后得到的 <strong>规范路径</strong> 。</p><p> </p><p><strong>示例 1：</strong></p><pre><strong>输入：</strong>path = \"/home/\"<strong><br />输出：</strong>\"/home\"<strong><br />解释：</strong>注意，最后一个目录名后面没有斜杠。 </pre><p><strong>示例 2：</strong></p><pre><strong>输入：</strong>path = \"/../\"<strong><br />输出：</strong>\"/\"<strong><br />解释：</strong>从根目录向上一级是不可行的，因为根目录是你可以到达的最高级。</pre><p><strong>示例 3：</strong></p><pre><strong>输入：</strong>path = \"/home//foo/\"<strong><br />输出：</strong>\"/home/foo\"<strong><br />解释：</strong>在规范路径中，多个连续斜杠需要用一个斜杠替换。</pre><p><strong>示例 4：</strong></p><pre><strong>输入：</strong>path = \"/a/./b/../../c/\"<strong><br />输出：</strong>\"/c\"</pre><p> </p><p><strong>提示：</strong></p><ul>\t<li><code>1 <= path.length <= 3000</code></li>\t<li><code>path</code> 由英文字母，数字，<code>'.'</code>，<code>'/'</code> 或 <code>'_'</code> 组成。</li>\t<li><code>path</code> 是一个有效的 Unix 风格绝对路径。</li></ul>",
      "language": "markdown"
    }
  ],
  "answer": [
    {
      "content": "",
      "language": "cpp"
    }
  ],
  "prepared": [
    [
      {
        "content": "",
        "language": "cpp"
      }
    ],
    [
      {
        "content": "",
        "language": "cpp"
      }
    ],
    [
      {
        "content": "",
        "language": "cpp"
      }
    ]
  ],
  "template": {
    "content": "#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\nstatic char *simplifyPath(char *path)\n{\n\tint len = strlen(path);\n\tif (len == 0)\n\t{\n\t\treturn path;\n\t}\n\tchar *p = path;\n\tint *indexes = malloc(len * sizeof(int));\n\tint depth = 0;\n\tint name_start = 1;\n\twhile (*p != '\\0')\n\t{\n\t\tif (*p == '/')\n\t\t{\n\t\t\tif (p > path && *(p - 1) != '/' && *(p - 1) != '.')\n\t\t\t{\n\t\t\t\tname_start = 1;\n\t\t\t}\n\t\t}\n\t\telse if (*p == '.')\n\t\t{\n\t\t\tif (*(p + 1) == '\\0' || *(p + 1) == '/')\n\t\t\t{\n\t\t\t\tp += 1;\n\t\t\t}\n\t\t\telse if (*(p + 1) == '.' && (*(p + 2) == '\\0' || *(p + 2) == '/'))\n\t\t\t{\n\t\t\t\tif (depth > 0)\n\t\t\t\t{\n\t\t\t\t\tdepth--;\n\t\t\t\t\tname_start = 1;\n\t\t\t\t}\n\t\t\t\tp += 2;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tindexes[depth++] = p - path;\n\t\t\t\twhile (*p != '/' && *p != '\\0')\n\t\t\t\t{\n\t\t\t\t\tp++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (*p == '\\0')\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (name_start && depth >= 0)\n\t\t\t{\n\t\t\t\tindexes[depth++] = p - path;\n\t\t\t\tname_start = 0;\n\t\t\t}\n\t\t}\n\t\tp++;\n\t}\n\tint i;\n\tchar *result = malloc(len + 1);\n\tchar *q = result;\n\tif (depth <= 0)\n\t{\n\t\t*q++ = '/';\n\t}\n\telse\n\t{\n\t\tfor (i = 0; i < depth; i++)\n\t\t{\n\t\t\tp = path + indexes[i];\n\t\t\t*q++ = '/';\n\t\t\twhile (*p != '/')\n\t\t\t{\n\t\t\t\t*q++ = *p++;\n\t\t\t}\n\t\t}\n\t}\n\t*q = '\\0';\n\treturn result;\n}\nint main(int argc, char **argv)\n{\n\tif (argc != 2)\n\t{\n\t\tfprintf(stderr, \"Usage: ./test path\\n\");\n\t\texit(-1);\n\t}\n\tprintf(\"%s\\n\", simplifyPath(argv[1]));\n\treturn 0;\n}",
    "language": "cpp"
  },
  "node_id": "dailycode-c3c6ea1a42034a1abe5bbb20adff156d",
  "license": "csdn.net",
  "created_at": 1637894158,
  "topic_link": "https://bbs.csdn.net/topics/600470830"
}