leetcode 71 简化路径

awsl
测试用例"/…" 不过 自己也不知道如何去改了😭
参考liuyubobobo老师的代码(真优雅👀)

class Solution {
public:
    string simplifyPath(string path) {

        vector<string> stack; //这里并没有真正用栈,不然倒来倒去有点麻烦
        for(int start = 1, i = 1; i <= path.size(); i ++)
            if(i == path.size() || path[i] == '/'){
                string f = path.substr(start, i - start);
                if(f.size()){
                    if(f == ".."){
                        if(stack.size()) stack.pop_back(); 
                    }
                    else if(f != ".") stack.push_back(f); //为字母的情况
                    //为.的情况就直接不放入最终的vector中了
                }
                start = i + 1;
            }

        string res = ""; //解决了 "/..."这个测试用例的问题 当后面都没有/的时候
        for(string e: stack)
            res += "/" + e;
        return res == "" ? "/" : res; //处理栈为空时的情况
    }
};

我遇到过的问题
"/../" 还有 "/c//" 矛盾了 这里是自己当栈为空的时候没返回好
"/." "/..." 也错了 这里是末尾的.没有判断好
末尾的. / 都要特殊判断一下
我的一坨代码。。。😭

class Solution {
public:
    string simplifyPath(string path) {

        stack<char> symbol;

        if(path[0] != '/')
            return "";
        else
            symbol.push(path[0]);

        for(int i = 1 ; i < path.size(); i++ ){
            if(path[i] != '/' & path[i] != '.')
                symbol.push(path[i]);
            else if(path[i] == '/'){
                char match = symbol.top();
                if( i != path.size()-1 & match == '/') continue; //因为最后要处理一下栈顶的/ 所以这里要加一个判断
                else{
                    if(match == '.'){
                        symbol.pop();
                    }else
                        symbol.push(path[i]);
                }

            }else if(path[i] == '.'){
                char match = symbol.top();
                if(match != '.' && i != path.size()-1 ) symbol.push(path[i]);
                else if(match != '.' && i == path.size()-1) continue;
                else{
                    if(symbol.size() == 2) symbol.pop();
                   else{
                        symbol.pop(); //点
                        symbol.pop(); //杠
                        symbol.pop(); //字母
                    }

                }
            }
        }


        stack<char> result;
        while(symbol.size() != 1 && symbol.top() == '/' ) symbol.pop();


        while(!symbol.empty()){
            result.push(symbol.top());
            symbol.pop();
        }

        string res;
        int n = result.size();
        for(int i = 0 ; i < n; i++){
            res += result.top();
            result.pop();
        }



        return res;


    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五月的天气

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值