题目: 简化路径

来自智得网
跳转至: 导航、​ 搜索

分析

方法一:栈

栈是一种很适合处理括号匹配、路径等问题的数据结构,因为这些问题都可以通过入栈和出栈的操作来解决。对于简化路径问题,我们可以把路径分解成若干个部分,使用栈来存储有效路径,同时避免存储无效路径。

具体实现思路如下:

  1. 首先把给定路径按照斜杠('/')分解成若干个子字符串(使用字符串流stringstream来实现)。
  2. 对于每个子字符串,如果它表示当前目录(即为 "."),则跳过;如果它表示上一级目录(即为 ".."),则把栈顶元素弹出(如果栈非空);否则,把当前目录入栈。
  3. 最后,把栈中的元素依次连接起来,中间加上斜杠即可。

以下是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;
    }
};

方法二:字符串替换

另一个解决简化路径问题的方法是使用字符串替换。具体实现思路如下:

  1. 首先,把路径按照斜杠('/')分解成若干个子字符串。
  2. 对于每个子字符串,如果它表示当前目录(即为 "."),则跳过;如果它表示上一级目录(即为 ".."),则把当前目录和它之前的目录一起弹出(如果不为空);否则,把当前目录入栈。
  3. 最后,把栈中的元素连接起来,中间加上斜杠即可。

以下是C++的实现代码: