LeetCode 力扣官方题解 | 71. 简化路径
发布时间:2022-10-21 11:03:49 所属栏目:Unix 来源:
导读: 题目描述
给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径。
在 Unix 风格的文件系统中,一个点(.)表示当前
给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径。
在 Unix 风格的文件系统中,一个点(.)表示当前
|
题目描述 给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 '/' 开头),请你将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,'//')都被视为单个斜杠 '/' 。对于此问题,任何其他格式的点(例如,'...')均被视为文件/目录名称。请注意,返回的 规范路径 必须遵循下述格式: 返回简化后得到的 规范路径 。 示例 1: 输入:path = "/home/" 输出:"/home" 解释:注意,最后一个目录名后面没有斜杠。 示例 2: 输入:path = "/../" 输出:"/" 解释:从根目录向上一级是不可行的,因为根目录是你可以到达的最高级。 示例 3: 输入:path = "/home//foo/" 输出:"/home/foo" 解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。 示例 4: 输入:path = "/a/./b/../../c/" 输出:"/c" 提示: 解决方案 方法一:栈 我们首先将给定的字符串 path 根据 / 分割成一个由若干字符串组成的列表,记为 names。根据题目中规定的「规范路径的下述格式」,names 中包含的字符串只能为以下几种: 对于「空字符串」以及「一个点」,我们实际上无需对它们进行处理,因为「空字符串」没有任何含义,而「一个点」表示当前目录本身,我们无需切换目录。 对于「两个点」或者「目录名」,我们则可以用一个栈来维护路径中的每一个目录名。当我们遇到「两个点」时,需要将目录切换到上一级,因此只要栈不为空,我们就弹出栈顶的目录。当我们遇到「目录名」时,就把它放入栈。 这样一来,我们只需要遍历 names 中的每个字符串并进行上述操作即可。在所有的操作完成后,我们将从栈底到栈顶的字符串用 / 进行连接unix路径简化,再在最前面加上 / 表示根目录,就可以得到简化后的规范路径。 代码 C++ 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(move(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(move(name)); } } string ans; if (stack.empty()) { ans = "/"; } else { for (string& name: stack) { ans += "/" + move(name); } } return ans; } }; Java class Solution { public String simplifyPath(String path) { String[] names = path.split("/"); Deque<String> stack = new ArrayDeque<String>(); for (String name : names) { if ("..".equals(name)) { if (!stack.isEmpty()) { stack.pollLast(); } } else if (name.length() > 0 && !".".equals(name)) { stack.offerLast(name); } } StringBuffer ans = new StringBuffer(); if (stack.isEmpty()) { ans.append('/'); } else { while (!stack.isEmpty()) { ans.append('/'); ans.append(stack.pollFirst()); } } return ans.toString(); } } C# public class Solution { public string SimplifyPath(string path) { string[] names = path.Split("/"); IList<string> stack = new List<string>(); foreach (string name in names) { if ("..".Equals(name)) { if (stack.Count > 0) { stack.RemoveAt(stack.Count - 1); } } else if (name.Length > 0 && !".".Equals(name)) { stack.Add(name); } } StringBuilder ans = new StringBuilder(); if (stack.Count == 0) { ans.Append('/'); } else { foreach (string name in stack) { ans.Append('/'); ans.Append(name); } } return ans.ToString(); } } Python3 class Solution: def simplifyPath(self, path: str) -> str: names = path.split("/") stack = list() for name in names: if name == "..": if stack: stack.pop() elif name and name != ".": stack.append(name) return "/" + "/".join(stack) C char ** split(const char * s, char delim, int * returnSize) { int n = strlen(s); char ** ans = (char **)malloc(sizeof(char *) * n); int pos = 0; int curr = 0; int len = 0; while (pos < n) { while (pos < n && s[pos] == delim) { ++pos; } curr = pos; while (pos < n && s[pos] != delim) { ++pos; } if (curr < n) { ans[len] = (char *)malloc(sizeof(char) * (pos - curr + 1)); strncpy(ans[len], s + curr, pos - curr); ans[len][pos - curr] = '\0'; ++len; } } *returnSize = len; return ans; } char * simplifyPath(char * path){ int namesSize = 0; int n = strlen(path); char ** names = split(path, '/', &namesSize); char ** stack = (char **)malloc(sizeof(char *) * namesSize); int stackSize = 0; for (int i = 0; i < namesSize; ++i) { if (!strcmp(names[i], "..")) { if (stackSize > 0) { --stackSize; } } else if (strcmp(names[i], ".")){ stack[stackSize] = names[i]; ++stackSize; } } char * ans = (char *)malloc(sizeof(char) * (n + 1)); int curr = 0; if (stackSize == 0) { ans[curr] = '/'; ++curr; } else { for (int i = 0; i < stackSize; ++i) { ans[curr] = '/'; ++curr; strcpy(ans + curr, stack[i]); curr += strlen(stack[i]); } } ans[curr] = '\0'; for (int i = 0; i < namesSize; ++i) { free(names[i]); } free(names); free(stack); return ans; } Golang func simplifyPath(path string) string { stack := []string{} for _, name := range strings.Split(path, "/") { if name == ".." { if len(stack) > 0 { stack = stack[:len(stack)-1] } } else if name != "" && name != "." { stack = append(stack, name) } } return "/" + strings.Join(stack, "/") } JavaScript var simplifyPath = function(path) { const names = path.split("/"); const stack = []; for (const name of names) { if (name === "..") { if (stack.length) { stack.pop(); } } else if (name.length && name !== ".") { stack.push(name); } } return "/" + stack.join("/"); }; 复杂度分析 BY / (编辑:我爱制作网_沈阳站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐


浙公网安备 33038102330576号