力扣刷题日记71简化路径

本题的难度为中等但是却比较难实现,我一开始的思想是遇到“..”和‘.’直接跳过即可,实际上没有考虑到很多的问题,我想接下来一起解读这段代码为好

class Solution {
public:
    string simplifyPath(string path) {
        auto split = [](const string& s, char delim) -> vector<string> {
            vector<string> ans;//用于存储结果
            string cur; //用于存储当前的子字符串
            for (char ch: s) {
                if (ch == delim) { //当当前的字符为"/"时
                    ans.push_back(move(cur)); //这里用转移而非复制的方式把cur中的字符串压入了ans中
                    cur.clear();
                }
                else {
                    cur += ch;
                }
            }
            ans.push_back(move(cur));
            return ans;
        };

        vector<string> names = split(path, '/');//split函数就是用于分割的
        vector<string> stack;
        for (string& name: names) {
            if (name == "..") {
                if (!stack.empty()) {
                    stack.pop_back();//因为..为上一个路径,所以需要出栈,以此进入上一个路径
                }
            }
            else if (!name.empty() && name != ".") {
                stack.push_back(move(name));
            }
        }
        string ans;

        if (stack.empty()) {
            ans = "/";//如果栈说空的题目所说即返回'/'
        }
        else {
            for (string& name: stack) {
                ans += "/" + move(name);//如果栈非空那么返回最终的字符串
            }
        }
        return ans;
    }
};

整个代码的逻辑分为以下三个部分:

1.定义了split函数,根据/分割字符串

2.特别判定'.'和'..'如果说为前者不加入栈,为后者的话需要出栈

3.最后整合

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值