Simplify Path

最后更新于:2022-04-01 22:56:09

## 一.题目描述 Given an absolute path for a file (Unix-style), simplify it.  For example,  path = “/home/”, => “/home”  path = “/a/./b/../../c/”, => “/c” Corner Cases:  • Did you consider the case where path = “/../”? In this case, you should return “/”. • Another corner case is the path might contain multiple slashes ‘/’ together, such as “/home//foo/”. In this case, you should ignore redundant slashes and return “/home/foo”. ## 二.题目分析 简化一个Unix风格下的文件路径。例如输入代表路径的字符串:”/home/”,简化后为:”/home”;或输入”/a/./b/../../c/”,简化为:”/c” 字符串中,应该了解到”..”是返回到路径的上级目录(如果当前根目录则不处理),这里使用栈来记录路径名。在处理字符串的过程中,有以下条件: ~~~ 1\. 重复连续出现的'/',只按1个处理,即跳过重复连续出现的'/'; 2\. 如果路径名不为"."和"..",将记录的字符串入栈; 3\. 如果路径名是".."且栈不为空,则需要出栈,否则无需处理; ~~~ 在遍历字符串后,逐个取出栈中元素(即已保存的路径名),用’/’分隔并拼接起来,注意取出的元素是从后往前连接的。 ## 三.实例代码 ~~~ #include #include #include using namespace std; class Solution { public: string simplifyPath(string path) { stack str; for (size_t i = 0; i < path.size(); ++i) { string name = ""; while (i < path.size() && path[i] == '/') ++i; // 该操作跳过斜线'/' while (i < path.size() && path[i] != '/') name += path[i++]; // 开始记录路径名,包括".." if (name != "." && name != "..") // 对对不同的文件名进行不同操作 str.push(name); // 非".."文件名,压栈 else if (!str.empty() && name == "..") str.pop(); // 当前文件名为"..",表示退到上层目录,需弹出栈 } if (str.empty()) return "/"; string result = ""; while (!str.empty()) { result = "/" + str.top() + result; // 最后组合path str.pop(); } return result; } }; ~~~ ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-05_568bb5ee4aabb.jpg) ## 四.小结 这道题使用了string类的一些操作,该类的一些功能确实非常强大。以下是关于string类的一些用法总结:  [http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html](http://www.cnblogs.com/xFreedom/archive/2011/05/16/2048037.html)
';