题目: 简化路径
来自智得网
分析
方法一:栈
栈是一种很适合处理括号匹配、路径等问题的数据结构,因为这些问题都可以通过入栈和出栈的操作来解决。对于简化路径问题,我们可以把路径分解成若干个部分,使用栈来存储有效路径,同时避免存储无效路径。
具体实现思路如下:
- 首先把给定路径按照斜杠('/')分解成若干个子字符串(使用字符串流stringstream来实现)。
- 对于每个子字符串,如果它表示当前目录(即为 "."),则跳过;如果它表示上一级目录(即为 ".."),则把栈顶元素弹出(如果栈非空);否则,把当前目录入栈。
- 最后,把栈中的元素依次连接起来,中间加上斜杠即可。
以下是C++的实现代码:
class Solution {
public:
string simplifyPath(string path) {
stringstream ss(path);
stack<string> stk;
string res, tmp;
while (getline(ss, tmp, '/')) {
if (tmp == "" || tmp == ".") continue;
if (tmp == ".." && !stk.empty()) stk.pop();
else if (tmp != "..") stk.push(tmp);
}
while (!stk.empty()) {
res = '/' + stk.top() + res;
stk.pop();
}
return res.empty() ? "/" : res;
}
};
方法二:字符串替换
另一个解决简化路径问题的方法是使用字符串替换。具体实现思路如下:
- 首先,把路径按照斜杠('/')分解成若干个子字符串。
- 对于每个子字符串,如果它表示当前目录(即为 "."),则跳过;如果它表示上一级目录(即为 ".."),则把当前目录和它之前的目录一起弹出(如果不为空);否则,把当前目录入栈。
- 最后,把栈中的元素连接起来,中间加上斜杠即可。
以下是C++的实现代码: