Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/"
, => "/home"
path = "/a/./b/../../c/"
, => "/c"
"/../"
?"/"
.‘/‘
together,
such as "/home//foo/"
."/home/foo"
.基本思路:
1. 以字符 / 作为分隔符,取子串。
2. 对 .. 作特殊处理。
3. 即不是. 又不是 .. 则存入栈中
4. 最后串接
所遇到的特殊case,
输入 /... (连着三个小数点)
期望输出 /.. (亦是连着三个小数点).
进入循环前,在path末尾添加 / , 作为哨兵,可简化代码。
class Solution { public: string simplifyPath(string path) { vector<string> stack; string name; path.push_back('/'); for (int i=0; i<path.size(); i++) { if (path[i] == '/') { if (name == "..") { if (!stack.empty()) stack.pop_back(); } else if (name != "." && !name.empty()) stack.push_back(name); name.clear(); } else name.push_back(path[i]); } if (stack.empty()) return "/"; string ans; for (auto p: stack) ans += "/" + p; return ans; } };
原文地址:http://blog.csdn.net/elton_xiao/article/details/44960521