LeetCode算法71:简化路径
链接: https://leetcode-cn.com/problems/simplify-path
题目描述
给你一个字符串 path
,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 ‘/’
开头),请你将其转化为更加简洁的规范路径。
在 Unix 风格的文件系统中,一个点(.
)表示当前目录本身;此外,两个点 (…
) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,’//’
)都被视为单个斜杠 ‘/’
。 对于此问题,任何其他格式的点(例如,’…’
)均被视为文件/目录名称。
请注意,返回的 规范路径 必须遵循下述格式:
始终以斜杠 ‘/’
开头。
两个目录名之间必须只有一个斜杠 ‘/’
。
最后一个目录名(如果存在)不能 以 ‘/’
结尾。
此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 ‘.’
或 ‘…’)。
返回简化后得到的 规范路径 。
C++代码解答
class Solution {
public:
std::string simplifyPath(std::string path) {
std::size_t len = path.size();
std::list<std::string> subStrings;
std::size_t i = 0;
while (i < len) {
std::size_t index = path.find('/', i + 1);
std::string s;
if (index != std::string::npos) {
s = path.substr(i, index - i);
} else {
s = path.substr(i, len);
index = len;
}
if (s == "/" || s == "/.") {
// do nothing
}
else if (s == "/..") {
if (!subStrings.empty()) {
subStrings.pop_back();
}
} else {
subStrings.push_back(s);
}
i = index;
}
if (subStrings.empty()) {
return "/";
}
std::string ret;
for (const auto& s : subStrings) {
ret += s;
}
return ret;
}
};