LeetCode 71. Simplify Path

来源:互联网 发布:看图片的软件 编辑:程序博客网 时间:2024/06/01 23:57

1. 题目描述

Given an absolute path for a file (Unix-style), simplify it.

For example,
path = “/home/”, => “/home”
path = “/a/./b/../../c/”, => “/c”
click to show corner cases.

Corner Cases:
Did you consider the case where path = “/../”?
In this case, you should return “/”.
Another corner case is the path might contain multiple slashes ‘/’ together, such as “/home//foo/”.
In this case, you should ignore redundant slashes and return “/home/foo”.

2. 解题思路

这是一道字符串的处理问题, 拿到这个问题, 首先想到的使用栈结构进行处理, 而且通过分析, 我们知道, 我们所需要处理的内容主要分为 4 个部分:
/ , /. , 这两个部分可以直接忽略
/.. , 弹栈
/xx, 压栈
最后全部输出即可

3. code

class Solution {public:    string simplifyPath(string path) {        stack<string> mystack;        int pos = 0, last = 0;        string substr;        while ((pos = path.find('/', last)) < (int)path.size()){            // 提取字串            if (pos == -1)                substr = path.substr(last);            else                substr = path.substr(last, pos - last);            // 处理 /. /.. / /xx            if (substr == "" || substr == ".")                ;            else if (substr == ".."){                if (!mystack.empty())                    mystack.pop();            }            else{                mystack.push(substr);            }            if (pos == -1)                break;            last = pos + 1;        }        if (mystack.empty())            return "/";        string res;        while (!mystack.empty()){            res = "/" + mystack.top() + res;            mystack.pop();        }        return res;    }};

4. 大神解法

一样的思路, 不过借助stringstream 实现字符串分隔, so brilliant !!!

string simplifyPath(string path) {    string res, tmp;    vector<string> stk;    stringstream ss(path);    while(getline(ss,tmp,'/')) {        if (tmp == "" or tmp == ".") continue;        if (tmp == ".." and !stk.empty()) stk.pop_back();        else if (tmp != "..") stk.push_back(tmp);    }    for(auto str : stk) res += "/"+str;    return res.empty() ? "/" : res;}
0 0
原创粉丝点击