Tuesday, September 8, 2015

Leetcode 71: simplify path

Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"

这个题目首先要搞清楚Unix的路径表示方法:总结为4点:
1. ‘/’ 是delimiter, 分界符,相当于是说明一个下面开始一个目录了。
2. '.' 指当前目录,再处理的时候可以直接忽略
3. ‘..’ 指parent 目录, 在处理的时候可以直接把当前目录删除,回到上一级目录
4. 其他字符或者字符串, 目录名,需要保留

这个题目的解法其实是模拟了一个stack,因为每次到当前字符的时候,需要对之前的那个目录级的元素进行处理,我们可以用两个变量来模拟这个过程, curDir只存当前的目录,即在 ‘/’ 和 ‘/’之间的string, allDir存当目前为止处理好的目录,allDir里面暂时不加'/',仅仅只是独立的目录,在最后得到 rst的时候再对这些独立的目录加 ‘/’分解符进行处理。
class Solution {
public:
    string simplifyPath(string path) {
        string curDir = "";
        vector<string> allDir;
        path += "/";
        for (char c : path) {
            if (c == '/') {
                if (curDir.size() == 0) {
                    continue;
                } else if (curDir == ".") {
                    curDir.clear();
                } else if (curDir == "..") {
                    if (!allDir.empty()) {
                        allDir.pop_back();
                    }
                    curDir.clear();
                } else {
                    allDir.push_back(curDir);
                    curDir.clear();
                }
            } else {
                curDir += c;
            }
        }
        string rst = "";
        for (int i = 0; i < allDir.size(); i++) {
            rst += "/" + allDir[i];
        }
        if (rst.size() == 0) rst += "/";
        return rst;
    }

};

No comments:

Post a Comment