代码随想录算法训练营第11天 | 20.有效的括号 1047.删除字符串中的所有相邻重复项 150.逆波兰表达式求值

Leetcode - 20 有效的括号

这道题数据结构课程讲过这道题所以也比较好做,这道题用栈来实现,为了优化效率,我们可以先判断字符串的长度是否为基数,如果是基数我们就可以直接返回false,若果不是接着下面的继续判断,这道题我们利用栈的陷入后出的特点,当我们遍历到最后一个左括号就可以和最后入栈的有括号进行对比如果与栈中的元素相同就继续向下遍历,不同就报错,这里有三种错误的形式需要考虑到,一种是左括号数量大于有括号数量,一种是右括号数量大于左括号数量,最后一种是左右括号不匹配。当左括号数量大于有括号数量时,如果遍历到元素对应栈中的元素为空就报错,当右括号数量大于左括号数量时,最后返回栈是否为空,若果不为空就返回false,当括号不匹配时可以对该元素进行判断若该元素不等于栈中对应的元素就返回false

class Solution {
public:
    bool isValid(string s) {
        stack<char> a;
        if(s.size() % 2 != 0){
            return false;
        }
        for(int i = 0; i < s.size(); i++){
            if(s[i] == '('){
                a.push(')');
            }
            else if(s[i] == '['){
                a.push(']');
            }
            else if(s[i] == '{'){
                a.push('}');
            }
            else if(a.empty() || a.top() != s[i]){
                return false;
            }else{
                a.pop();
            }
        }
        return a.empty();
    }
};

Leetcode - 1047 删除字符串中的所有相邻重复项

erase函数的第一个参数是要删除的起始位置,第二个参数是要删除的字符数。

这则代码我的思路跟上题的大差不差但是我是用了erase这个函数来消除重复字符,但也就是因为这一点导致代码出了个bug一直照不出来是为什么对于全部为同一字母的序列就不会输出正确答案。。

class Solution {
public:
    string removeDuplicates(string s) {
        stack<char> index;
        int i = 0;
        for(; i < s.size(); i++){
            if(!index.empty() && index.top() == s[i]){
                int w = i - 2;
                s.erase(i - 1, 2);
                i = max(0, w);
                index.pop();
            }else{
                index.push(s[i]);
            }
        }
        return s;
    }
};

看了一个多小时才发现是那个max坏了一锅汤,我始终觉得-1会越界就取了个max但是没注意到上面还有个i++这就导致直接会漏掉一组重复字母。

class Solution {
public:
    string removeDuplicates(string s) {
        stack<char> index;
        int i = 0;
        for(; i < s.size(); i++){
            if(!index.empty() && index.top() == s[i]){
                int w = i - 2;
                s.erase(i - 1, 2);
                i = max(0, w);
                index.pop();
            }else{
                index.push(s[i]);
            }
        }
        return s;
    }
};

这期间还手写了一个while循环取替换掉erase函数但发现时间复杂度更高了。。。。

Leetcode - 150 逆波兰表达式求值

这道题也就是题目理解难了一点查了一下就通透了比较简单:

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> op;
        for (int i = 0; i < tokens.size(); i++) {
            if (tokens[i][0] >= '0' && tokens[i][0] <= '9' || (tokens[i].size() > 1 && tokens[i][0] == '-')) {
                // Convert the operand from string to integer and push onto the stack
                op.push(std::stoi(tokens[i]));
            } else if (tokens[i][0] == '+' || tokens[i][0] == '-' || tokens[i][0] == '*' || tokens[i][0] == '/') {
                int b = op.top();
                op.pop();
                int a = op.top();
                op.pop();
                
                // 进行条件判断,并将结果入栈
                if (tokens[i][0] == '+') {
                    op.push(a + b);
                } else if (tokens[i][0] == '-') {
                    op.push(a - b);
                } else if (tokens[i][0] == '*') {
                    op.push(a * b);
                } else if (tokens[i][0] == '/') {
                    op.push(a / b);
                }
            }
        }
        // 返回栈顶的值作为最终结果
        return op.top();
    }
};

2024/3/5 20.47

-----------magixx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值