https://leetcode.com/problems/simplify-path/
Given an absolute path for a file (Unix-style), simplify it.
For example,
path = “/home/”, => “/home”
path = “/a/./b/../../c/”, => “/c”
- 关键在于如何识别 / 之间的字符串。stringstream + getline(第一种方法,更优雅),或者首先用空格分隔不同的字符串,然后再用 stringstream(第二种方法)。空格分隔的前提是路径中不包含空格,是连续的。所以还是第一种方法更好。
- 即便需要用到栈结构也没必要一定要使用 stack,因为 vector 可以模拟栈,而且还比栈拥有更多的方法。
- ? : 的使用使得代码更加简洁。
#include <string>
#include <sstream>
#include <stack>
#include <vector>
using std::string;
using std::stringstream;
using std::stack;
using std::vector;
class Solution {
public:
string simplifyPath(string path) { // Runtime: 8 ms
stringstream ss(path);
string sTmp, ret;
vector<string> v;
while (getline(ss, sTmp, '/')) {
if (sTmp == "" || sTmp == ".") {
continue;
}
else if (sTmp == "..") {
if (!v.empty()) {
v.pop_back();
}
}
else {
v.push_back(sTmp);
}
}
for (auto str : v) {
ret += "/" + str;
}
return ret.empty() ? "/" : ret;
}
string simplifyPath2(string path) { // Runtime: 12 ms
for (auto& ch : path) {
if (ch == '/') {
ch = ' ';
}
}
stringstream ss(path);
stack<string> s;
string str;
while (ss >> str) {
if (str.compare(".") == 0) {
continue;
}
else if (str.compare("..") == 0) {
if (!s.empty()) {
s.pop();
}
}
else {
s.push(str);
}
}
string sret("");
while (!s.empty()) {
sret = "/" + s.top() + sret;
s.pop();
}
return sret.empty() ? "/" : sret;
// if (sret.empty()) {
// sret = "/";
// }
// return sret;
}
};