71.Simplify Path

给定一个字符串,表示一串文件路径,其中 '.','/' 可以跳过,'..' 表示返回上一层路径,输出最终的路径。

Input: "/a/./b/../../c/"
Output: "/c"

Input: "/home//foo/"
Output: "/home/foo"
Explanation: In the canonical path, multiple consecutive slashes are replaced by a single one.


思路:
利用栈来做,因为对于“..” 返回到上一层路径,就相当于栈的先进先出。对于“.”,"/" 跳过。


注意点:"…" ,OJ判断其为有效的路径。如:"/…",其结果为:"/…"。所以,不能只判断当前节点和前一个节点,需要将非"/"的都用字符串记录下来,碰到下一个"/"的时候再判断其是跳过、出栈、入栈的操作。当跳出for循环后,最后也要判断 字符串中是否还有剩余的值。

class Solution {
public:
    string simplifyPath(string path) {
        stack<string> s;
        string res = "", tmp = "";
        int n = path.size();
        for (int i = 0; i < n; i++) {
            if (path[i] == '/') {
                if (tmp.size() == 0) continue;
                if (tmp == "..") { //如果是“..”,判断栈中是否为空栈
                    if(s.size()>0) s.pop();
                }
                else if(tmp != ".") s.push(tmp);//入栈
                tmp = "";
            }
            else tmp += path[i];
        }
        if (tmp.size() > 0) {//判断字符串中是否还有值
            if (tmp == "..") {
                if (s.size() > 0) s.pop();
            }
            else if (tmp != ".") s.push(tmp);
        }
        while (s.size() > 0) {//出栈,转化为结果路径
            res = '/' + s.top() + res;
            s.pop();
        }
        if (res.size() == 0) res += '/';//结果为空时,要返回“/”
        return res;
    }
};

 

posted @ 2020-05-31 19:53  星海寻梦233  阅读(103)  评论(0编辑  收藏  举报