71. Simplify Path

你快乐吗?

Posted by bbkgl on September 26, 2019

# 71. Simplify Path


90%,其实就是考察栈stack的使用,当然最重要看懂题目,看不懂的切换成中文。题意和思路分析如下:

  • 将绝对路径转化成规范的路径
  • 输出的时候每个目录之间只能相隔一道/,且开头必有一道/;如果有一层以上的目录的话,结尾必没有/
  • .表示上一层目录保留,且这个效果不累加,所以碰到这个直接continue;
  • ..表示上一层目录不保留,且这个效果要累加,也就是如果有两个..,需要往上去掉两层目录,所以碰到这个也是continue;,但是要进行计数,便于累加效果
  • 所以采用栈进行储存很方便,栈空的时候不管..效果累加多少层都不用管了 具体思路见代码。
class Solution {
public:
    string simplifyPath(string path) {
        stack<string> s1, s2;
        string word;
        for (char ch : path) {
            if (ch == '/') {
                if (!word.empty()) {
                    s1.push(word);
                    word.clear();
                }
                continue;
            } else word.push_back(ch);
        }
        if (!word.empty()) s1.push(word);
        int cnt = 0;
        while (!s1.empty()) {
            word = s1.top();
            s1.pop();
            if (word == ".")
                continue;
            else if (word == "..")
                cnt++;
            else {
                if (cnt == 0)
                    s2.push(word);
                else cnt--;
            }
        }
        string ans;
        ans.push_back('/');
        while(!s2.empty()) {
            ans += s2.top();
            s2.pop();
            if (!s2.empty()) ans.push_back('/');
        }
        return ans;
    }
};